48#include "pw_containers/internal/var_len_entry_queue_iterator.h"
49#include "pw_preprocessor/util.h"
62#include "pw_bytes/span.h"
63#include "pw_containers/internal/generic_var_len_entry_queue.h"
64#include "pw_containers/internal/raw_storage.h"
65#include "pw_span/span.h"
66#include "pw_toolchain/constexpr_tag.h"
77#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3)
79#define _PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes) \
80 (PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 + \
81 _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes))
83#define _PW_VAR_QUEUE_DATA_SIZE_UINT32(max_size_bytes) \
84 ((_PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) + 3 ) / 4)
86#define _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes) \
87 (PW_VARINT_ENCODED_SIZE_BYTES(max_size_bytes) + max_size_bytes + \
98 size_t kMaxSizeBytes = containers::internal::kGenericSized>
101 containers::internal::kGenericSized> {
107 using value_type =
typename Base::value_type;
108 using const_value_type =
typename Base::const_value_type;
109 using size_type =
typename Base::size_type;
110 using pointer =
typename Base::pointer;
111 using const_pointer =
typename Base::const_pointer;
112 using reference =
typename Base::reference;
113 using const_reference =
typename Base::const_reference;
116 : array_{_PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
122 : array_{_PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
128 *
this = std::move(other);
136 template <
typename,
size_t>
144 std::array<uint32_t, _PW_VAR_QUEUE_SIZE_UINT32(kMaxSizeBytes)> array_;
162 :
public containers::internal::GenericVarLenEntryQueue<
163 BasicInlineVarLenEntryQueue<T, containers::internal::kGenericSized>,
166 using Base = containers::internal::GenericVarLenEntryQueue<
171 using value_type = containers::internal::VarLenEntry<T>;
172 using const_value_type = containers::internal::VarLenEntry<const T>;
173 using size_type = std::uint32_t;
174 using pointer =
const value_type*;
175 using const_pointer = pointer;
176 using reference =
const value_type&;
177 using const_reference = reference;
182 template <
size_t kArraySize>
185 size_t array_size_uint32);
195 uint32_t buffer_size()
const {
return array()[kBufferSize]; }
197 uint32_t head()
const {
return array()[kHead]; }
198 void set_head(uint32_t head) { array()[kHead] = head; }
200 uint32_t tail()
const {
return array()[kTail]; }
201 void set_tail(uint32_t tail) { array()[kTail] = tail; }
204 return span<T>(
reinterpret_cast<T*
>(array().subspan(kNumFields).data()),
208 span<const T> buffer()
const {
209 return span<const T>(
210 reinterpret_cast<const T*
>(array().subspan(kNumFields).data()),
215 static constexpr size_t kNumFields = 3;
216 static constexpr size_t kBufferSize = 0;
217 static constexpr size_t kHead = 1;
218 static constexpr size_t kTail = 2;
220 template <
typename,
typename>
221 friend class containers::internal::GenericVarLenEntryQueue;
228 span<uint32_t> array() {
229 return static_cast<BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
231 span<const uint32_t> array()
const {
232 return static_cast<const BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
237template <
size_t kMaxSizeBytes = containers::
internal::kGenericSized>
246template <
typename T,
size_t kMaxSizeBytes>
250 PW_ASSERT(this->GetBufferSize() >= other.GetBufferSize());
254 other.GetBufferSize();
255 std::memcpy(this->array(), other.array(), array_size);
259template <
typename T,
size_t kMaxSizeBytes>
260BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>&
261BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>::operator=(
262 BasicInlineVarLenEntryQueue<T>&& other) {
271template <
size_t kArraySize>
272BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
273 uint32_t (&array)[kArraySize]) {
276 "InlineVarLenEntryQueue must be backed by an array with more than "
277 "PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3) elements");
278 return Init(array, kArraySize);
282BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
283 uint32_t array[],
size_t array_size_uint32) {
284 auto array_size =
static_cast<uint32_t
>(array_size_uint32);
286 array[0] = array_size *
sizeof(uint32_t);
289 return *(std::launder(
reinterpret_cast<BasicInlineVarLenEntryQueue*
>(array)));
293span<const T> BasicInlineVarLenEntryQueue<T>::raw_storage()
const {
294 size_t raw_size = (kNumFields *
sizeof(uint32_t)) + buffer_size();
295 return span<const T>(
reinterpret_cast<const T*
>(array().data()), raw_size);
300#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
301 static_assert(sizeof(pw::InlineVarLenEntryQueue<max_size_bytes>) == \
302 _PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes) * sizeof(uint32_t));
306#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes)
324#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_DECLARE(variable, max_size_bytes) \
325 _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
326 uint32_t variable[_PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes)] = { \
327 _PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0u, 0u}
329typedef uint32_t* pw_InlineVarLenEntryQueue_Handle;
330typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
337 pw_InlineVarLenEntryQueue_Handle queue);
341 pw_InlineVarLenEntryQueue_ConstHandle queue);
345 pw_InlineVarLenEntryQueue_Handle queue);
349 pw_InlineVarLenEntryQueue_ConstHandle queue);
353 pw_InlineVarLenEntryQueue_ConstHandle queue);
357 pw_InlineVarLenEntryQueue_ConstHandle queue);
361 pw_InlineVarLenEntryQueue_ConstHandle queue);
365 pw_InlineVarLenEntryQueue_ConstHandle queue);
369 pw_InlineVarLenEntryQueue_ConstHandle queue);
374 uint32_t data_size_bytes);
379 const uint32_t data_size_bytes);
383 pw_InlineVarLenEntryQueue_Handle queue,
385 uint32_t data_size_bytes);
395 pw_InlineVarLenEntryQueue_ConstHandle queue);
399 pw_InlineVarLenEntryQueue_ConstHandle from,
400 pw_InlineVarLenEntryQueue_Handle to);
404 pw_InlineVarLenEntryQueue_ConstHandle from,
405 pw_InlineVarLenEntryQueue_Handle to);
409 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
413 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
Definition: inline_var_len_entry_queue.h:164
Definition: inline_var_len_entry_queue.h:101
Definition: span_impl.h:235
void pw_InlineVarLenEntryQueue_Push(pw_InlineVarLenEntryQueue_Handle queue, const void *data, uint32_t data_size_bytes)
bool pw_InlineVarLenEntryQueue_TryPush(pw_InlineVarLenEntryQueue_Handle queue, const void *data, const uint32_t data_size_bytes)
void pw_InlineVarLenEntryQueue_CopyEntriesOverwrite(pw_InlineVarLenEntryQueue_ConstHandle from, pw_InlineVarLenEntryQueue_Handle to)
void pw_InlineVarLenEntryQueue_MoveEntries(pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to)
uint32_t pw_InlineVarLenEntryQueue_Size(pw_InlineVarLenEntryQueue_ConstHandle queue)
void pw_InlineVarLenEntryQueue_CopyEntries(pw_InlineVarLenEntryQueue_ConstHandle from, pw_InlineVarLenEntryQueue_Handle to)
void pw_InlineVarLenEntryQueue_Init(uint32_t array[], size_t array_size_uint32)
uint32_t pw_InlineVarLenEntryQueue_RawStorageSizeBytes(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)
void pw_InlineVarLenEntryQueue_MoveEntriesOverwrite(pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to)
void pw_InlineVarLenEntryQueue_Clear(pw_InlineVarLenEntryQueue_Handle queue)
uint32_t pw_InlineVarLenEntryQueue_MaxSize(pw_InlineVarLenEntryQueue_ConstHandle queue)
bool pw_InlineVarLenEntryQueue_Empty(pw_InlineVarLenEntryQueue_ConstHandle queue)
pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_End(pw_InlineVarLenEntryQueue_Handle queue)
pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_Begin(pw_InlineVarLenEntryQueue_Handle queue)
pw_InlineVarLenEntryQueue_ConstIterator pw_InlineVarLenEntryQueue_ConstBegin(pw_InlineVarLenEntryQueue_ConstHandle queue)
uint32_t pw_InlineVarLenEntryQueue_SizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
pw_InlineVarLenEntryQueue_ConstIterator pw_InlineVarLenEntryQueue_ConstEnd(pw_InlineVarLenEntryQueue_ConstHandle queue)
uint32_t pw_InlineVarLenEntryQueue_MaxSizeBytes(pw_InlineVarLenEntryQueue_ConstHandle queue)
span< const T > raw_storage() const
static BasicInlineVarLenEntryQueue & Init(uint32_t(&array)[kArraySize])
#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32
Definition: inline_var_len_entry_queue.h:77
The Pigweed namespace.
Definition: alignment.h:27
Definition: constexpr_tag.h:48