48#include "pw_containers/internal/generic_var_len_entry_queue.h"
49#include "pw_containers/internal/var_len_entry_queue_iterator.h"
50#include "pw_preprocessor/util.h"
63#include "pw_bytes/span.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_BYTES(max_size_bytes) + 3 ) / 4))
91 size_t kMaxSizeBytes = containers::internal::kGenericSized>
105 using size_type =
typename Base::size_type;
112 : array_{PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
118 : array_{PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
124 *
this = std::move(other);
132 template <
typename,
size_t>
140 std::array<uint32_t, _PW_VAR_QUEUE_SIZE_UINT32(kMaxSizeBytes)> array_;
159 BasicInlineVarLenEntryQueue<T, containers::internal::kGenericSized>,
169 using size_type = std::uint32_t;
178 template <
size_t kArraySize>
181 size_t array_size_uint32);
192 static constexpr size_t kNumFields = 3;
193 static constexpr size_t kBufferSize = 0;
194 static constexpr size_t kHead = 1;
195 static constexpr size_t kTail = 2;
198 template <
typename,
typename>
201 size_t buffer_size()
const {
return array()[kBufferSize]; }
203 size_t head()
const {
return array()[kHead]; }
204 void set_head(
size_t head) { array()[kHead] =
static_cast<uint32_t
>(head); }
206 size_t tail()
const {
return array()[kTail]; }
207 void set_tail(
size_t tail) { array()[kTail] =
static_cast<uint32_t
>(tail); }
210 return span<T>(
reinterpret_cast<T*
>(array().subspan(kNumFields).data()),
214 span<const T> buffer()
const {
215 return span<const T>(
216 reinterpret_cast<const T*
>(array().subspan(kNumFields).data()),
225 span<uint32_t> array() {
226 return static_cast<BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
228 span<const uint32_t> array()
const {
229 return static_cast<const BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
234template <
size_t kMaxSizeBytes = containers::
internal::kGenericSized>
243template <
typename T,
size_t kMaxSizeBytes>
247 PW_ASSERT(this->GetBufferSize() >= other.GetBufferSize());
251 other.GetBufferSize();
252 std::memcpy(this->array(), other.array(), array_size);
256template <
typename T,
size_t kMaxSizeBytes>
257BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>&
258BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>::operator=(
259 BasicInlineVarLenEntryQueue<T>&& other) {
269template <
size_t kArraySize>
270BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
271 uint32_t (&array)[kArraySize]) {
274 "InlineVarLenEntryQueue must be backed by an array with more than "
275 "PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3) elements");
276 return Init(array, kArraySize);
280BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
281 uint32_t array[],
size_t array_size_uint32) {
282 auto array_size =
static_cast<uint32_t
>(array_size_uint32);
284 array[0] = array_size *
sizeof(uint32_t);
287 return *(std::launder(
reinterpret_cast<BasicInlineVarLenEntryQueue*
>(array)));
291span<const T> BasicInlineVarLenEntryQueue<T>::raw_storage()
const {
292 size_t raw_size = (kNumFields *
sizeof(uint32_t)) + buffer_size();
293 return span<const T>(
reinterpret_cast<const T*
>(array().data()), raw_size);
299#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
300 static_assert(sizeof(pw::InlineVarLenEntryQueue<max_size_bytes>) == \
301 _PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes) * sizeof(uint32_t));
305#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes)
323#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_DECLARE(variable, max_size_bytes) \
324 _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
325 uint32_t variable[_PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes)] = { \
326 PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0u, 0u}
328typedef uint32_t* pw_InlineVarLenEntryQueue_Handle;
329typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
338 pw_InlineVarLenEntryQueue_Handle queue);
342 pw_InlineVarLenEntryQueue_ConstHandle queue);
346 pw_InlineVarLenEntryQueue_Handle queue);
350 pw_InlineVarLenEntryQueue_ConstHandle queue);
354 pw_InlineVarLenEntryQueue_ConstHandle queue);
358 pw_InlineVarLenEntryQueue_ConstHandle queue);
362 pw_InlineVarLenEntryQueue_ConstHandle queue);
366 pw_InlineVarLenEntryQueue_ConstHandle queue);
370 pw_InlineVarLenEntryQueue_ConstHandle queue);
375 uint32_t data_size_bytes);
380 const uint32_t data_size_bytes);
384 pw_InlineVarLenEntryQueue_Handle queue,
386 uint32_t data_size_bytes);
397 pw_InlineVarLenEntryQueue_ConstHandle queue);
401 pw_InlineVarLenEntryQueue_ConstHandle from,
402 pw_InlineVarLenEntryQueue_Handle to);
406 pw_InlineVarLenEntryQueue_ConstHandle from,
407 pw_InlineVarLenEntryQueue_Handle to);
411 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
415 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
Definition: inline_var_len_entry_queue.h:160
Definition: inline_var_len_entry_queue.h:97
Definition: generic_var_len_entry_queue.h:139
Refers to an entry in-place in the queue. Entries may be discontiguous.
Definition: var_len_entry.h:65
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)
Empties the queue.
uint32_t pw_InlineVarLenEntryQueue_MaxSize(pw_InlineVarLenEntryQueue_ConstHandle queue)
bool pw_InlineVarLenEntryQueue_Empty(pw_InlineVarLenEntryQueue_ConstHandle queue)
Returns true if the queue is empty, false if it has at least one entry.
pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_End(pw_InlineVarLenEntryQueue_Handle queue)
Returns an iterator to the end of the queue.
pw_InlineVarLenEntryQueue_Iterator pw_InlineVarLenEntryQueue_Begin(pw_InlineVarLenEntryQueue_Handle queue)
Returns an iterator to the start of the 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
Definition: var_len_entry_queue_iterator.h:172
Definition: var_len_entry_queue_iterator.h:166