C/C++ API Reference
Loading...
Searching...
No Matches
inline_var_len_entry_queue.h
Go to the documentation of this file.
1// Copyright 2023 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#ifdef __cplusplus
17
18#include <cstddef>
19#include <cstdint>
20
21#include "pw_toolchain/constexpr_tag.h"
22
23#else
24
25#include <stdbool.h>
26#include <stddef.h>
27#include <stdint.h>
28#include <string.h>
29
30#endif // __cplusplus
31
32#include "pw_preprocessor/compiler.h"
33#include "pw_preprocessor/util.h"
34#include "pw_varint/varint.h"
35
36// TODO: https://pwbug.dev/426012010 - Find a way to single-source this
37// content on the Sphinx site without Breathe.
66
67#ifdef __cplusplus
68extern "C" {
69#endif // __cplusplus
70
72
75
78
82typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
83
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), /*head=*/0u, /*tail=*/0u}
95
101#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3)
102
106static inline void pw_InlineVarLenEntryQueue_Init(uint32_t array[],
107 size_t array_size_uint32);
108
110static inline void pw_InlineVarLenEntryQueue_Clear(
112
118 const void* data,
119 uint32_t data_size_bytes);
120
127 const void* data,
128 const uint32_t data_size_bytes);
129
137 const void* data,
138 uint32_t data_size_bytes);
139
144
150typedef struct {
151 // Private: do not access these fields directly!
152 pw_InlineVarLenEntryQueue_ConstHandle _pw_queue;
153 uint32_t _pw_offset;
155
156typedef struct {
157 // Private: do not access these fields directly!
160
163typedef struct {
164 uint8_t* data_1;
165 uint32_t size_1;
166 uint8_t* data_2;
167 uint32_t size_2;
169
171typedef struct {
172 const uint8_t* data_1;
173 uint32_t size_1;
174 const uint8_t* data_2;
175 uint32_t size_2;
177
181
185
188pw_InlineVarLenEntryQueue_ConstEnd(pw_InlineVarLenEntryQueue_ConstHandle queue);
189
194
198
203
208
212 const pw_InlineVarLenEntryQueue_Iterator* iterator);
213
217
227 void* dest,
228 uint32_t count);
229
230// clang-tidy gives errors for `static inline` functions in headers, so disable
231// these diagnostics.
233PW_MODIFY_DIAGNOSTIC_CLANG(ignored, "-Wunused-function");
234PW_MODIFY_DIAGNOSTIC_CLANG(ignored, "-Wunneeded-internal-declaration");
235
238 const pw_InlineVarLenEntryQueue_Entry* entry, void* dest, uint32_t count) {
240 memcpy(&const_entry, entry, sizeof(const_entry));
241 return pw_InlineVarLenEntryQueue_ConstEntry_Copy(&const_entry, dest, count);
242}
243
246static inline uint8_t pw_InlineVarLenEntryQueue_Entry_At(
247 const pw_InlineVarLenEntryQueue_Entry* entry, size_t index);
248
251static inline uint8_t pw_InlineVarLenEntryQueue_ConstEntry_At(
252 const pw_InlineVarLenEntryQueue_ConstEntry* entry, size_t index);
253
257 pw_InlineVarLenEntryQueue_ConstHandle queue);
258
261static inline uint32_t pw_InlineVarLenEntryQueue_MaxSize(
262 pw_InlineVarLenEntryQueue_ConstHandle queue);
263
267 pw_InlineVarLenEntryQueue_ConstHandle queue);
268
273static inline uint32_t pw_InlineVarLenEntryQueue_MaxSizeBytes(
274 pw_InlineVarLenEntryQueue_ConstHandle queue);
275
280 pw_InlineVarLenEntryQueue_ConstHandle queue);
281
284static inline bool pw_InlineVarLenEntryQueue_Empty(
285 pw_InlineVarLenEntryQueue_ConstHandle queue);
286
288
290
291// Implementation details.
292
293#define _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes) \
294 ((_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) + 3 /* round up */) / 4)
295
296#define _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) \
297 (PW_VARINT_ENCODED_SIZE_BYTES(max_size_bytes) + max_size_bytes + \
298 1 /*end byte*/)
299
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] // points after the last byte
303#define _PW_VAR_QUEUE_DATA ((const uint8_t*)&queue[3])
304
305static inline void pw_InlineVarLenEntryQueue_Init(uint32_t array[],
306 size_t array_size_uint32) {
307 array[0] = (uint32_t)(array_size_uint32 -
309 sizeof(uint32_t);
310 array[1] = 0; // head
311 array[2] = 0; // tail
312}
313
316 _PW_VAR_QUEUE_HEAD = 0; // head
317 _PW_VAR_QUEUE_TAIL = 0; // tail
318}
319
322 pw_InlineVarLenEntryQueue_Iterator begin = {{queue, _PW_VAR_QUEUE_HEAD}};
323 return begin;
324}
325
327pw_InlineVarLenEntryQueue_ConstBegin(
328 pw_InlineVarLenEntryQueue_ConstHandle queue) {
329 pw_InlineVarLenEntryQueue_ConstIterator begin = {queue, _PW_VAR_QUEUE_HEAD};
330 return begin;
331}
332
335 pw_InlineVarLenEntryQueue_Iterator end = {{queue, _PW_VAR_QUEUE_TAIL}};
336 return end;
337}
338
341 pw_InlineVarLenEntryQueue_ConstHandle queue) {
342 pw_InlineVarLenEntryQueue_ConstIterator end = {queue, _PW_VAR_QUEUE_TAIL};
343 return end;
344}
345
349}
350
355 &rhs->_iterator);
356}
357
361 return lhs->_pw_offset == rhs->_pw_offset && lhs->_pw_queue == rhs->_pw_queue;
362}
363
366 const pw_InlineVarLenEntryQueue_Iterator* iterator) {
368 pw_InlineVarLenEntryQueue_GetConstEntry(&iterator->_iterator);
370 memcpy(&entry, &const_entry, sizeof(entry));
371 return entry;
372}
373
374// Private function that returns a pointer to the specified index in the entry.
375static inline const uint8_t* _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(
376 const pw_InlineVarLenEntryQueue_ConstEntry* entry, size_t index) {
377 if (index < entry->size_1) {
378 return &entry->data_1[index];
379 }
380 return &entry->data_2[index - entry->size_1];
381}
382
383const uint8_t* _pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(
384 const pw_InlineVarLenEntryQueue_ConstEntry* entry, size_t index);
385
387 const pw_InlineVarLenEntryQueue_Entry* entry, size_t index) {
389 memcpy(&const_entry, entry, sizeof(const_entry));
390 return pw_InlineVarLenEntryQueue_ConstEntry_At(&const_entry, index);
391}
392
394 const pw_InlineVarLenEntryQueue_ConstEntry* entry, size_t index) {
395 return *_pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(entry, index);
396}
397
399 pw_InlineVarLenEntryQueue_ConstHandle queue) {
400 return PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 * sizeof(uint32_t) +
401 _PW_VAR_QUEUE_ARRAY_SIZE_BYTES;
402}
403
405 pw_InlineVarLenEntryQueue_ConstHandle queue) {
406 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1;
407}
408
410 pw_InlineVarLenEntryQueue_ConstHandle queue) {
411 return _PW_VAR_QUEUE_ARRAY_SIZE_BYTES - 1 -
412 (uint32_t)pw_varint_EncodedSizeBytes(_PW_VAR_QUEUE_ARRAY_SIZE_BYTES -
413 1);
414}
415
417 pw_InlineVarLenEntryQueue_ConstHandle queue) {
418 return _PW_VAR_QUEUE_HEAD == _PW_VAR_QUEUE_TAIL;
419}
421
422// These macros are not part of the public API, so undefine them.
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
427
428#ifdef __cplusplus
429} // extern "C"
430
431#include <cstddef>
432#include <limits>
433#include <type_traits>
434#include <utility>
435
436#include "pw_containers/internal/raw_storage.h"
437#include "pw_span/span.h"
438
439namespace pw {
440namespace containers::internal {
441
442template <typename T>
443class VarLenEntryQueueEntry;
444
445} // namespace containers::internal
446
447// A`BasicInlineVarLenEntryQueue` with a known maximum size of a single entry.
448// The member functions are immplemented in the generic-capacity base.
449// TODO: b/303056683 - Add helper for calculating kMaxSizeBytes for N entries of
450// a particular size.
451template <typename T,
452 size_t kMaxSizeBytes = containers::internal::kGenericSized>
455 containers::internal::kGenericSized> {
456 private:
457 using Base =
459
460 public:
461 BasicInlineVarLenEntryQueue() : Base(kMaxSizeBytes) {}
462
463 // Explicit zero element constexpr constructor. Using this constructor will
464 // place the entire object in .data, which will increase ROM size. Use with
465 // caution if working with large capacity sizes.
467 : Base(kMaxSizeBytes), data_{} {}
468
469 // `BasicInlineVarLenEntryQueue` is trivially copyable.
472 default;
473
474 private:
475 static_assert(kMaxSizeBytes <=
476 std::numeric_limits<typename Base::size_type>::max());
477
478 using Base::Init; // Disallow Init since the size template param is not used.
479
480 uint32_t data_[_PW_VAR_QUEUE_DATA_SIZE_UINT32(kMaxSizeBytes)];
481};
482
484
487
490
498template <typename T>
499class BasicInlineVarLenEntryQueue<T, containers::internal::kGenericSized> {
500 public:
503 using size_type = std::uint32_t;
504 using pointer = const value_type*;
505 using const_pointer = pointer;
506 using reference = const value_type&;
508
513 class iterator;
514
516 class const_iterator;
517
519 template <size_t kArraySize>
520 static BasicInlineVarLenEntryQueue& Init(uint32_t (&array)[kArraySize]) {
521 static_assert(
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);
526 }
527
529 static BasicInlineVarLenEntryQueue& Init(uint32_t array[],
530 size_t array_size_uint32) {
531 pw_InlineVarLenEntryQueue_Init(array, array_size_uint32);
532 return *std::launder(reinterpret_cast<BasicInlineVarLenEntryQueue*>(array));
533 }
534
537 value_type front() { return *begin(); }
538
539 const_value_type front() const { return *cbegin(); }
540
542 iterator begin() {
543 return iterator(pw_InlineVarLenEntryQueue_ConstBegin(array_));
544 }
545 const_iterator begin() const {
546 return const_iterator(pw_InlineVarLenEntryQueue_ConstBegin(array_));
547 }
548 const_iterator cbegin() const { return begin(); }
549
551 iterator end() {
552 return iterator(pw_InlineVarLenEntryQueue_ConstEnd(array_));
553 }
554 const_iterator end() const {
555 return const_iterator(pw_InlineVarLenEntryQueue_ConstEnd(array_));
556 }
557 const_iterator cend() const { return end(); }
558
560 [[nodiscard]] bool empty() const {
561 return pw_InlineVarLenEntryQueue_Empty(array_);
562 }
563
565 size_type size() const { return pw_InlineVarLenEntryQueue_Size(array_); }
566
568 size_type max_size() const {
570 }
571
573 size_type size_bytes() const {
575 }
576
578 size_type max_size_bytes() const {
580 }
581
585 return span<const T>(reinterpret_cast<const T*>(array_),
587 }
588
591
593 void push(span<const T> value) {
595 array_, value.data(), static_cast<size_type>(value.size()));
596 }
597
599 [[nodiscard]] bool try_push(span<const T> value) {
601 array_, value.data(), static_cast<size_type>(value.size()));
602 }
603
607 array_, value.data(), static_cast<size_type>(value.size()));
608 }
609
612
613 protected:
614 constexpr BasicInlineVarLenEntryQueue(uint32_t max_size_bytes)
615 : array_{_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0, 0} {}
616
617 // Polymorphic-sized queues cannot be destroyed directly due to the lack of a
618 // virtual destructor.
619 ~BasicInlineVarLenEntryQueue() = default;
620
621 BasicInlineVarLenEntryQueue(const BasicInlineVarLenEntryQueue&) = default;
622 BasicInlineVarLenEntryQueue& operator=(const BasicInlineVarLenEntryQueue&) =
623 default;
624
625 private:
626 static_assert(std::is_integral_v<T> || std::is_same_v<T, std::byte>);
627 static_assert(sizeof(T) == sizeof(std::byte));
628
630};
631
632namespace containers::internal {
633
634template <typename T>
636 public:
637 using difference_type = std::ptrdiff_t;
638 using value_type = std::remove_cv_t<T>;
639 using pointer = T*;
640 using reference = T&;
641 using iterator_category = std::forward_iterator_tag;
642
643 constexpr VarLenEntryQueueEntryIterator() : entry_(nullptr), index_(0) {}
644
646 const VarLenEntryQueueEntryIterator&) = default;
647 constexpr VarLenEntryQueueEntryIterator& operator=(
648 const VarLenEntryQueueEntryIterator&) = default;
649
650 constexpr VarLenEntryQueueEntryIterator& operator++() {
651 index_ += 1;
652 return *this;
653 }
654 constexpr VarLenEntryQueueEntryIterator operator++(int) {
655 VarLenEntryQueueEntryIterator previous_value(*this);
656 operator++();
657 return previous_value;
658 }
659
660 constexpr VarLenEntryQueueEntryIterator& operator+=(difference_type n) {
661 index_ += static_cast<size_t>(n);
662 return *this;
663 }
664
665 reference operator*() const { return const_cast<reference>(*operator->()); }
666
667 pointer operator->() const {
668 return const_cast<pointer>(reinterpret_cast<const T*>(
669 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(entry_, index_)));
670 }
671
672 friend VarLenEntryQueueEntryIterator operator+(
673 const VarLenEntryQueueEntryIterator& it, difference_type n) {
674 return VarLenEntryQueueEntryIterator(*it.entry_,
675 it.index_ + static_cast<size_t>(n));
676 }
677
678 friend VarLenEntryQueueEntryIterator operator+(
679 difference_type n, const VarLenEntryQueueEntryIterator& it) {
680 return VarLenEntryQueueEntryIterator(*it.entry_,
681 it.index_ + static_cast<size_t>(n));
682 }
683
684 friend bool operator==(const VarLenEntryQueueEntryIterator& lhs,
686 return lhs.entry_->data_1 == rhs.entry_->data_1 && lhs.index_ == rhs.index_;
687 }
688 friend bool operator!=(const VarLenEntryQueueEntryIterator& lhs,
690 return !(lhs == rhs);
691 }
692
693 private:
694 template <typename U>
695 friend class VarLenEntryQueueEntry;
696
698 const pw_InlineVarLenEntryQueue_ConstEntry& entry, size_t index)
699 : entry_(&entry), index_(index) {}
700
702 size_t index_;
703};
704
706template <typename T>
708 public:
709 using element_type = T;
710 using value_type = std::remove_cv_t<T>;
711 using size_type = std::uint32_t;
712 using pointer = T*;
713 using const_pointer = const T*;
714 using reference = T&;
715 using const_reference = const T&;
716
721
722 constexpr VarLenEntryQueueEntry(const VarLenEntryQueueEntry&) = default;
723 constexpr VarLenEntryQueueEntry& operator=(const VarLenEntryQueueEntry&) =
724 default;
725
726 constexpr operator VarLenEntryQueueEntry<const T>() const {
727 return VarLenEntryQueueEntry<const T>(entry_);
728 }
729
730 reference at(size_t index) const {
731 return const_cast<reference>(*reinterpret_cast<const_pointer>(
732 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointerChecked(&entry_,
733 index)));
734 }
735
736 reference operator[](size_t index) const {
737 return const_cast<reference>(*reinterpret_cast<const_pointer>(
738 _pw_InlineVarLenEntryQueue_ConstEntry_GetPointer(&entry_, index)));
739 }
740
741 reference front() const {
742 return const_cast<reference>(
743 reinterpret_cast<const_reference>(*entry_.data_1));
744 }
745 reference back() const { return operator[](size() - 1); }
746
750 std::pair<span<element_type>, span<element_type>> contiguous_data() const {
751 return std::make_pair(
752 span(
753 const_cast<pointer>(reinterpret_cast<const_pointer>(entry_.data_1)),
754 entry_.size_1),
755 span(
756 const_cast<pointer>(reinterpret_cast<const_pointer>(entry_.data_2)),
757 entry_.size_2));
758 }
759
765 size_type copy(value_type* dest, size_type count) const {
766 return pw_InlineVarLenEntryQueue_ConstEntry_Copy(&entry_, dest, count);
767 }
768
769 iterator begin() const { return iterator(entry_, 0); }
770 const_iterator cbegin() const { return const_iterator(entry_, 0); }
771
772 iterator end() const { return iterator(entry_, size()); }
773 const_iterator cend() const { return const_iterator(entry_, size()); }
774
775 [[nodiscard]] bool empty() const { return size() == 0; }
776
777 size_type size() const { return entry_.size_1 + entry_.size_2; }
778
779 private:
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;
785
786 explicit constexpr VarLenEntryQueueEntry(
787 const pw_InlineVarLenEntryQueue_ConstEntry& entry)
788 : entry_(entry) {}
789
790 constexpr VarLenEntryQueueEntry() : entry_{} {}
791
793};
794
795} // namespace containers::internal
796
797template <typename T>
799 public:
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;
805
806 constexpr const_iterator() : iterator_{}, entry_{} {}
807
808 constexpr const_iterator(const const_iterator&) = default;
809 constexpr const_iterator& operator=(const const_iterator&) = default;
810
811 const_iterator& operator++() {
813 entry_.entry_.data_1 = nullptr; // mark the entry as unloaded
814 return *this;
815 }
816 const_iterator operator++(int) {
817 const_iterator previous_value(*this);
818 operator++();
819 return previous_value;
820 }
821
822 reference operator*() const {
823 LoadEntry();
824 return entry_;
825 }
826 pointer operator->() const {
827 LoadEntry();
828 return &entry_;
829 }
830
831 bool operator==(const const_iterator& rhs) const {
833 &rhs.iterator_);
834 }
835 bool operator!=(const const_iterator& rhs) const { return !(*this == rhs); }
836
837 private:
838 friend class BasicInlineVarLenEntryQueue;
839
840 explicit constexpr const_iterator(
842 : iterator_(it) {}
843
844 void LoadEntry() const {
845 if (entry_.entry_.data_1 == nullptr) {
846 entry_.entry_ = pw_InlineVarLenEntryQueue_GetConstEntry(&iterator_);
847 }
848 }
849
851 mutable value_type entry_;
852};
853
854template <typename T>
856 public:
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;
862
863 constexpr iterator() : iterator_{}, entry_{} {}
864
865 constexpr iterator(const iterator&) = default;
866 constexpr iterator& operator=(const iterator&) = default;
867
868 iterator& operator++() {
870 entry_.entry_.data_1 = nullptr; // mark the entry as unloaded
871 return *this;
872 }
873 iterator operator++(int) {
874 iterator previous_value(*this);
875 operator++();
876 return previous_value;
877 }
878
879 reference operator*() const {
880 LoadEntry();
881 return entry_;
882 }
883 pointer operator->() const {
884 LoadEntry();
885 return &entry_;
886 }
887
888 bool operator==(const iterator& rhs) const {
890 &rhs.iterator_);
891 }
892 bool operator!=(const iterator& rhs) const { return !(*this == rhs); }
893
894 private:
895 friend class BasicInlineVarLenEntryQueue;
896
897 explicit constexpr iterator(const pw_InlineVarLenEntryQueue_ConstIterator& it)
898 : iterator_(it) {}
899
900 void LoadEntry() const {
901 if (entry_.entry_.data_1 == nullptr) {
902 entry_.entry_ = pw_InlineVarLenEntryQueue_GetConstEntry(&iterator_);
903 }
904 }
905
907 mutable value_type entry_;
908};
909
911template <size_t kMaxSizeBytes = containers::internal::kGenericSized>
914
916
918
919} // namespace pw
920
921#endif // __cplusplus
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).