21#include "pw_toolchain/constexpr_tag.h"
32#include "pw_preprocessor/compiler.h"
33#include "pw_preprocessor/util.h"
82typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
91#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_DECLARE(variable, max_size_bytes) \
92 uint32_t variable[PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 + \
93 _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes)] = { \
94 _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0u, 0u}
101#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3)
107 size_t array_size_uint32);
119 uint32_t data_size_bytes);
128 const uint32_t data_size_bytes);
138 uint32_t data_size_bytes);
152 pw_InlineVarLenEntryQueue_ConstHandle _pw_queue;
172 const uint8_t* data_1;
174 const uint8_t* data_2;
240 memcpy(&const_entry, entry,
sizeof(const_entry));
257 pw_InlineVarLenEntryQueue_ConstHandle queue);
262 pw_InlineVarLenEntryQueue_ConstHandle queue);
267 pw_InlineVarLenEntryQueue_ConstHandle queue);
274 pw_InlineVarLenEntryQueue_ConstHandle queue);
280 pw_InlineVarLenEntryQueue_ConstHandle queue);
285 pw_InlineVarLenEntryQueue_ConstHandle queue);
293#define _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes) \
294 ((_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) + 3 ) / 4)
296#define _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) \
297 (PW_VARINT_ENCODED_SIZE_BYTES(max_size_bytes) + max_size_bytes + \
300#define _PW_VAR_QUEUE_ARRAY_SIZE_BYTES queue[0]
301#define _PW_VAR_QUEUE_HEAD queue[1]
302#define _PW_VAR_QUEUE_TAIL queue[2]
303#define _PW_VAR_QUEUE_DATA ((const uint8_t*)&queue[3])
306 size_t array_size_uint32) {
307 array[0] = (uint32_t)(array_size_uint32 -
316 _PW_VAR_QUEUE_HEAD = 0;
317 _PW_VAR_QUEUE_TAIL = 0;
327pw_InlineVarLenEntryQueue_ConstBegin(
328 pw_InlineVarLenEntryQueue_ConstHandle queue) {
341 pw_InlineVarLenEntryQueue_ConstHandle queue) {
361 return lhs->_pw_offset == rhs->_pw_offset && lhs->_pw_queue == rhs->_pw_queue;
370 memcpy(&entry, &const_entry,
sizeof(entry));
375static inline const uint8_t* _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(
377 if (index < entry->size_1) {
378 return &entry->data_1[index];
380 return &entry->data_2[index - entry->size_1];
383const uint8_t* _pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(
389 memcpy(&const_entry, entry,
sizeof(const_entry));
395 return *_pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(entry, index);
399 pw_InlineVarLenEntryQueue_ConstHandle queue) {
401 _PW_VAR_QUEUE_ARRAY_SIZE_BYTES;
405 pw_InlineVarLenEntryQueue_ConstHandle queue) {
406 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1;
410 pw_InlineVarLenEntryQueue_ConstHandle queue) {
411 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1 -
417 pw_InlineVarLenEntryQueue_ConstHandle queue) {
418 return _PW_VAR_QUEUE_HEAD == _PW_VAR_QUEUE_TAIL;
423#undef _PW_VAR_QUEUE_ARRAY_SIZE_BYTES
424#undef _PW_VAR_QUEUE_HEAD
425#undef _PW_VAR_QUEUE_TAIL
426#undef _PW_VAR_QUEUE_DATA
433#include <type_traits>
436#include "pw_containers/internal/raw_storage.h"
437#include "pw_span/span.h"
440namespace containers::internal {
443class VarLenEntryQueueEntry;
452 size_t kMaxSizeBytes = containers::internal::kGenericSized>
455 containers::internal::kGenericSized> {
467 :
Base(kMaxSizeBytes), data_{} {}
475 static_assert(kMaxSizeBytes <=
476 std::numeric_limits<typename Base::size_type>::max());
480 uint32_t data_[_PW_VAR_QUEUE_DATA_SIZE_UINT32(kMaxSizeBytes)];
503 using size_type = std::uint32_t;
516 class const_iterator;
519 template <
size_t kArraySize>
523 "InlineVarLenEntryQueue must be backed by an array with more than "
524 "PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3) elements");
525 return Init(array, kArraySize);
530 size_t array_size_uint32) {
539 const_value_type front()
const {
return *cbegin(); }
543 return iterator(pw_InlineVarLenEntryQueue_ConstBegin(array_));
545 const_iterator begin()
const {
546 return const_iterator(pw_InlineVarLenEntryQueue_ConstBegin(array_));
548 const_iterator cbegin()
const {
return begin(); }
554 const_iterator end()
const {
557 const_iterator cend()
const {
return end(); }
595 array_, value.data(),
static_cast<size_type
>(value.size()));
601 array_, value.data(),
static_cast<size_type
>(value.size()));
607 array_, value.data(),
static_cast<size_type
>(value.size()));
615 : array_{_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0, 0} {}
619 ~BasicInlineVarLenEntryQueue() =
default;
621 BasicInlineVarLenEntryQueue(
const BasicInlineVarLenEntryQueue&) =
default;
622 BasicInlineVarLenEntryQueue& operator=(
const BasicInlineVarLenEntryQueue&) =
626 static_assert(std::is_integral_v<T> || std::is_same_v<T, std::byte>);
627 static_assert(
sizeof(T) ==
sizeof(std::byte));
632namespace containers::internal {
637 using difference_type = std::ptrdiff_t;
638 using value_type = std::remove_cv_t<T>;
640 using reference = T&;
641 using iterator_category = std::forward_iterator_tag;
657 return previous_value;
661 index_ +=
static_cast<size_t>(n);
665 reference operator*()
const {
return const_cast<reference
>(*operator->()); }
667 pointer operator->()
const {
668 return const_cast<pointer
>(
reinterpret_cast<const T*
>(
669 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(entry_, index_)));
675 it.index_ +
static_cast<size_t>(n));
681 it.index_ +
static_cast<size_t>(n));
686 return lhs.entry_->data_1 == rhs.entry_->data_1 && lhs.index_ == rhs.index_;
690 return !(lhs == rhs);
694 template <
typename U>
699 : entry_(&entry), index_(index) {}
709 using element_type = T;
710 using value_type = std::remove_cv_t<T>;
711 using size_type = std::uint32_t;
713 using const_pointer =
const T*;
714 using reference = T&;
715 using const_reference =
const T&;
730 reference at(
size_t index)
const {
731 return const_cast<reference
>(*
reinterpret_cast<const_pointer
>(
732 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(&entry_,
736 reference operator[](
size_t index)
const {
737 return const_cast<reference
>(*
reinterpret_cast<const_pointer
>(
738 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(&entry_, index)));
741 reference front()
const {
742 return const_cast<reference
>(
743 reinterpret_cast<const_reference
>(*entry_.data_1));
745 reference back()
const {
return operator[](size() - 1); }
751 return std::make_pair(
753 const_cast<pointer
>(
reinterpret_cast<const_pointer
>(entry_.data_1)),
756 const_cast<pointer
>(
reinterpret_cast<const_pointer
>(entry_.data_2)),
765 size_type
copy(value_type* dest, size_type count)
const {
770 const_iterator cbegin()
const {
return const_iterator(entry_, 0); }
773 const_iterator cend()
const {
return const_iterator(entry_, size()); }
775 [[nodiscard]]
bool empty()
const {
return size() == 0; }
777 size_type size()
const {
return entry_.size_1 + entry_.size_2; }
780 friend class VarLenEntryQueueEntry<std::remove_const_t<T>>;
781 friend class BasicInlineVarLenEntryQueue;
782 friend class BasicInlineVarLenEntryQueue<std::remove_const_t<T>>
::iterator;
783 friend class BasicInlineVarLenEntryQueue<
784 std::remove_const_t<T>>::const_iterator;
786 explicit constexpr VarLenEntryQueueEntry(
787 const pw_InlineVarLenEntryQueue_ConstEntry& entry)
790 constexpr VarLenEntryQueueEntry() : entry_{} {}
800 using difference_type = std::ptrdiff_t;
802 using pointer =
const value_type*;
803 using reference =
const value_type&;
804 using iterator_category = std::forward_iterator_tag;
813 entry_.entry_.data_1 =
nullptr;
819 return previous_value;
822 reference operator*()
const {
826 pointer operator->()
const {
835 bool operator!=(
const const_iterator& rhs)
const {
return !(*
this == rhs); }
844 void LoadEntry()
const {
845 if (entry_.entry_.data_1 ==
nullptr) {
851 mutable value_type entry_;
857 using difference_type = std::ptrdiff_t;
859 using pointer =
const value_type*;
860 using reference =
const value_type&;
861 using iterator_category = std::forward_iterator_tag;
863 constexpr iterator() : iterator_{}, entry_{} {}
870 entry_.entry_.data_1 =
nullptr;
876 return previous_value;
879 reference operator*()
const {
883 pointer operator->()
const {
888 bool operator==(
const iterator& rhs)
const {
892 bool operator!=(
const iterator& rhs)
const {
return !(*
this == rhs); }
900 void LoadEntry()
const {
901 if (entry_.entry_.data_1 ==
nullptr) {
907 mutable value_type entry_;
911template <
size_t kMaxSizeBytes = containers::
internal::kGenericSized>
Definition: inline_var_len_entry_queue.h:798
Definition: inline_var_len_entry_queue.h:855
Definition: inline_var_len_entry_queue.h:499
Definition: inline_var_len_entry_queue.h:455
Refers to an entry in-place in the queue. Entries may be discontiguous.
Definition: inline_var_len_entry_queue.h:707
Definition: inline_var_len_entry_queue.h:635
Definition: span_impl.h:235
pw_InlineVarLenEntryQueue_ConstEntry pw_InlineVarLenEntryQueue_GetConstEntry(const pw_InlineVarLenEntryQueue_ConstIterator *iterator)
Dereferences a const 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:305
void pw_InlineVarLenEntryQueue_Push(pw_InlineVarLenEntryQueue_Handle queue, const void *data, uint32_t data_size_bytes)
static uint8_t pw_InlineVarLenEntryQueue_ConstEntry_At(const pw_InlineVarLenEntryQueue_ConstEntry *entry, size_t index)
Definition: inline_var_len_entry_queue.h:393
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:404
static bool pw_InlineVarLenEntryQueue_ConstIterator_Equal(const pw_InlineVarLenEntryQueue_ConstIterator *lhs, const pw_InlineVarLenEntryQueue_ConstIterator *rhs)
Compares two const iterators for equality.
Definition: inline_var_len_entry_queue.h:358
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:351
static uint32_t pw_InlineVarLenEntryQueue_MaxSizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
Definition: inline_var_len_entry_queue.h:409
uint32_t pw_InlineVarLenEntryQueue_Size(pw_InlineVarLenEntryQueue_ConstHandle queue)
uint32_t pw_InlineVarLenEntryQueue_ConstEntry_Copy(const pw_InlineVarLenEntryQueue_ConstEntry *entry, void *dest, uint32_t count)
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:416
static void pw_InlineVarLenEntryQueue_Iterator_Advance(pw_InlineVarLenEntryQueue_Iterator *iterator)
Definition: inline_var_len_entry_queue.h:346
static pw_InlineVarLenEntryQueue_Entry pw_InlineVarLenEntryQueue_GetEntry(const pw_InlineVarLenEntryQueue_Iterator *iterator)
Dereferences an iterator, loading the entry it points to.
Definition: inline_var_len_entry_queue.h:365
#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32
Definition: inline_var_len_entry_queue.h:101
static uint8_t pw_InlineVarLenEntryQueue_Entry_At(const pw_InlineVarLenEntryQueue_Entry *entry, size_t index)
Definition: inline_var_len_entry_queue.h:386
static uint32_t pw_InlineVarLenEntryQueue_Entry_Copy(const pw_InlineVarLenEntryQueue_Entry *entry, void *dest, uint32_t count)
Copies the contents of a mutable entry.
Definition: inline_var_len_entry_queue.h:237
uint32_t * pw_InlineVarLenEntryQueue_Handle
Definition: inline_var_len_entry_queue.h:81
static pw_InlineVarLenEntryQueue_ConstIterator pw_InlineVarLenEntryQueue_ConstEnd(pw_InlineVarLenEntryQueue_ConstHandle queue)
Returns an iterator that points past the end of the queue.
Definition: inline_var_len_entry_queue.h:340
static pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_Begin(pw_InlineVarLenEntryQueue_Handle queue)
Returns an iterator to the start of the InlineVarLenEntryQueue.
Definition: inline_var_len_entry_queue.h:321
static pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_End(pw_InlineVarLenEntryQueue_Handle queue)
Returns an iterator that points past the end of the queue.
Definition: inline_var_len_entry_queue.h:333
static void pw_InlineVarLenEntryQueue_Clear(pw_InlineVarLenEntryQueue_Handle queue)
Empties the queue.
Definition: inline_var_len_entry_queue.h:314
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:398
void pw_InlineVarLenEntryQueue_ConstIterator_Advance(pw_InlineVarLenEntryQueue_ConstIterator *iterator)
Advances a const iterator.
void pop()
Definition: inline_var_len_entry_queue.h:611
value_type front()
Definition: inline_var_len_entry_queue.h:537
bool try_push(span< const T > value)
Definition: inline_var_len_entry_queue.h:599
span< const T > raw_storage() const
Definition: inline_var_len_entry_queue.h:584
static BasicInlineVarLenEntryQueue & Init(uint32_t array[], size_t array_size_uint32)
Definition: inline_var_len_entry_queue.h:529
VarLenEntryQueueEntryIterator< T > iterator
Definition: inline_var_len_entry_queue.h:719
size_type copy(value_type *dest, size_type count) const
Definition: inline_var_len_entry_queue.h:765
std::pair< span< element_type >, span< element_type > > contiguous_data() const
Definition: inline_var_len_entry_queue.h:750
size_type size_bytes() const
Definition: inline_var_len_entry_queue.h:573
size_type max_size() const
Definition: inline_var_len_entry_queue.h:568
iterator end()
Returns an iterator that points past the end of the queue.
Definition: inline_var_len_entry_queue.h:551
static BasicInlineVarLenEntryQueue & Init(uint32_t(&array)[kArraySize])
Definition: inline_var_len_entry_queue.h:520
void push_overwrite(span< const T > value)
Definition: inline_var_len_entry_queue.h:605
bool empty() const
Definition: inline_var_len_entry_queue.h:560
size_type size() const
Definition: inline_var_len_entry_queue.h:565
void push(span< const T > value)
Definition: inline_var_len_entry_queue.h:593
size_type max_size_bytes() const
Definition: inline_var_len_entry_queue.h:578
iterator begin()
Returns an iterator to the start of the InlineVarLenEntryQueue.
Definition: inline_var_len_entry_queue.h:542
void clear()
Empties the queue.
Definition: inline_var_len_entry_queue.h:590
#define PW_MODIFY_DIAGNOSTIC_CLANG(kind, option)
Definition: compiler.h:221
#define PW_MODIFY_DIAGNOSTICS_POP()
Definition: compiler.h:194
#define PW_MODIFY_DIAGNOSTICS_PUSH()
Definition: compiler.h:189
The Pigweed namespace.
Definition: alignment.h:27
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...
Definition: constexpr_tag.h:48
Const version of pw_InlineVarLenEntryQueue_Entry.
Definition: inline_var_len_entry_queue.h:171
Definition: inline_var_len_entry_queue.h:150
Definition: inline_var_len_entry_queue.h:163
Definition: inline_var_len_entry_queue.h:156
size_t pw_varint_EncodedSizeBytes(uint64_t integer)
Returns the size of a uint64_t when encoded as a varint (LEB128).