16#include "pw_preprocessor/util.h"
30#include "pw_assert/assert.h"
31#include "pw_bytes/span.h"
33#include "pw_containers/internal/var_len_entry_iterator.h"
34#include "pw_containers/internal/wrap.h"
35#include "pw_span/span.h"
46namespace pw::containers::internal {
53constexpr uint32_t ReadVarLenEntryEncodedSize(span<T> bytes,
size_t offset);
60constexpr std::pair<uint32_t, uint32_t> ReadVarLenEntrySize(span<T> bytes,
67 using element_type = T;
68 using value_type = std::remove_cv_t<T>;
69 using size_type = uint32_t;
71 using const_pointer =
const T*;
73 using const_reference =
const T&;
88 [[nodiscard]]
constexpr bool empty()
const {
89 return data1_.empty() && data2_.empty();
92 constexpr size_t size()
const {
return data1_.size() + data2_.size(); }
97 constexpr reference
at(
size_t index)
const;
99 constexpr reference operator[](
size_t index)
const {
return at(index); }
100 constexpr reference front()
const {
return at(0); }
101 constexpr reference back()
const {
return at(size() - 1); }
107 return std::make_pair(data1_, data2_);
119 constexpr size_t copy(value_type* dest,
size_t count)
const;
122 constexpr const_iterator cbegin()
const {
return const_iterator(*
this, 0); }
125 constexpr const_iterator cend()
const {
126 return const_iterator(*
this, size());
129 [[nodiscard]]
friend constexpr bool operator==(
const VarLenEntry& lhs,
130 const VarLenEntry& rhs) {
131 return lhs.Equals(rhs);
133 [[nodiscard]]
friend constexpr bool operator!=(
const VarLenEntry& lhs,
134 const VarLenEntry& rhs) {
135 return !(lhs == rhs);
140 friend class VarLenEntry;
142 friend class VarLenEntryC;
145 friend class VarLenEntryQueueIterator;
147 constexpr VarLenEntry(span<T> data1, span<T> data2)
148 : data1_(data1), data2_(data2) {}
151 [[nodiscard]]
constexpr bool Equals(
const VarLenEntry& other)
const;
162constexpr uint32_t ReadVarLenEntryEncodedSize(span<T> bytes,
size_t offset) {
163 std::pair<uint32_t, uint32_t> entry_size = ReadVarLenEntrySize(bytes, offset);
164 return entry_size.first + entry_size.second;
168constexpr std::pair<uint32_t, uint32_t> ReadVarLenEntrySize(span<T> bytes,
170 uint32_t prefix_size = 0;
171 uint32_t data_size = 0;
175 std::byte(bytes[offset]), prefix_size++, &data_size)) {
176 return std::make_pair(prefix_size, data_size);
178 IncrementWithWrap(offset,
size_t(1), bytes.size());
184 using difference_type =
typename span<T>::difference_type;
185 size_t size1 = std::min(count, data1_.size());
186 auto end = data1_.begin() +
static_cast<difference_type
>(size1);
187 pw::copy(data1_.begin(), end, dest);
190 size_t size2 = std::min(count, data2_.size());
192 end = data2_.begin() +
static_cast<difference_type
>(size2);
193 pw::copy(data2_.begin(), end, dest);
195 return data1_.size() + data2_.size();
200 if (index < data1_.size()) {
201 return data1_[index];
203 index -= data1_.size();
204 PW_ASSERT(index < data2_.size());
205 return data2_[index];
210 return data1_.data() == other.data1_.data() &&
211 data1_.size() == other.data1_.size() &&
212 data2_.data() == other.data2_.data() &&
213 data2_.size() == other.data2_.size();
246 const uint8_t* data_1;
248 const uint8_t* data_2;
253uint32_t pw_InlineVarLenEntryQueue_Entry_Copy(
255uint32_t pw_InlineVarLenEntryQueue_ConstEntry_Copy(
261uint8_t pw_InlineVarLenEntryQueue_Entry_At(
263uint8_t pw_InlineVarLenEntryQueue_ConstEntry_At(
Definition: var_len_entry.h:218
Refers to an entry in-place in the queue. Entries may be discontiguous.
Definition: var_len_entry.h:65
constexpr reference at(size_t index) const
Definition: var_len_entry.h:199
VarLenEntryIterator< T > iterator
Definition: var_len_entry.h:77
constexpr size_t copy(value_type *dest, size_t count) const
Definition: var_len_entry.h:183
constexpr std::pair< span< T >, span< T > > contiguous_data() const
Definition: var_len_entry.h:106
Definition: var_len_entry_iterator.h:30
Definition: span_impl.h:235
constexpr OutputIt copy(InputIt first, InputIt last, OutputIt d_first)
constexpr backport of <algorithm>'s std::copy for C++17.
Definition: algorithm.h:355
constexpr size_t kMaxVarint32SizeBytes
Maximum size of a varint (LEB128) encoded uint32_t.
Definition: varint.h:74
constexpr bool DecodeOneByte(std::byte encoded, size_t count, T *out_value)
Definition: varint.h:396
Definition: var_len_entry.h:245
Definition: var_len_entry.h:238