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>
94 containers::internal::kGenericSized> {
100 using value_type =
typename Base::value_type;
101 using const_value_type =
typename Base::const_value_type;
102 using size_type =
typename Base::size_type;
103 using pointer =
typename Base::pointer;
104 using const_pointer =
typename Base::const_pointer;
105 using reference =
typename Base::reference;
106 using const_reference =
typename Base::const_reference;
109 : array_{PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
115 : array_{PW_VAR_QUEUE_DATA_SIZE_BYTES(kMaxSizeBytes), 0, 0} {}
121 *
this = std::move(other);
129 template <
typename,
size_t>
137 std::array<uint32_t, _PW_VAR_QUEUE_SIZE_UINT32(kMaxSizeBytes)> array_;
155 :
public containers::internal::GenericVarLenEntryQueue<
156 BasicInlineVarLenEntryQueue<T, containers::internal::kGenericSized>,
159 using Base = containers::internal::GenericVarLenEntryQueue<
164 using value_type = containers::internal::VarLenEntry<T>;
165 using const_value_type = containers::internal::VarLenEntry<const T>;
166 using size_type = std::uint32_t;
167 using pointer =
const value_type*;
168 using const_pointer = pointer;
169 using reference =
const value_type&;
170 using const_reference = reference;
175 template <
size_t kArraySize>
178 size_t array_size_uint32);
189 static constexpr size_t kNumFields = 3;
190 static constexpr size_t kBufferSize = 0;
191 static constexpr size_t kHead = 1;
192 static constexpr size_t kTail = 2;
195 template <
typename,
typename>
196 friend class containers::internal::GenericVarLenEntryQueue;
198 size_t buffer_size()
const {
return array()[kBufferSize]; }
200 size_t head()
const {
return array()[kHead]; }
201 void set_head(
size_t head) { array()[kHead] =
static_cast<uint32_t
>(head); }
203 size_t tail()
const {
return array()[kTail]; }
204 void set_tail(
size_t tail) { array()[kTail] =
static_cast<uint32_t
>(tail); }
207 return span<T>(
reinterpret_cast<T*
>(array().subspan(kNumFields).data()),
211 span<const T> buffer()
const {
212 return span<const T>(
213 reinterpret_cast<const T*
>(array().subspan(kNumFields).data()),
222 span<uint32_t> array() {
223 return static_cast<BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
225 span<const uint32_t> array()
const {
226 return static_cast<const BasicInlineVarLenEntryQueue<T, 0>*
>(
this)->array();
231template <
size_t kMaxSizeBytes = containers::
internal::kGenericSized>
240template <
typename T,
size_t kMaxSizeBytes>
244 PW_ASSERT(this->GetBufferSize() >= other.GetBufferSize());
248 other.GetBufferSize();
249 std::memcpy(this->array(), other.array(), array_size);
253template <
typename T,
size_t kMaxSizeBytes>
254BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>&
255BasicInlineVarLenEntryQueue<T, kMaxSizeBytes>::operator=(
256 BasicInlineVarLenEntryQueue<T>&& other) {
265template <
size_t kArraySize>
266BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
267 uint32_t (&array)[kArraySize]) {
270 "InlineVarLenEntryQueue must be backed by an array with more than "
271 "PW_VARIABLE_LENGTH_ENTRY_QUEUE_HEADER_SIZE_UINT32 (3) elements");
272 return Init(array, kArraySize);
276BasicInlineVarLenEntryQueue<T>& BasicInlineVarLenEntryQueue<T>::Init(
277 uint32_t array[],
size_t array_size_uint32) {
278 auto array_size =
static_cast<uint32_t
>(array_size_uint32);
280 array[0] = array_size *
sizeof(uint32_t);
283 return *(std::launder(
reinterpret_cast<BasicInlineVarLenEntryQueue*
>(array)));
287span<const T> BasicInlineVarLenEntryQueue<T>::raw_storage()
const {
288 size_t raw_size = (kNumFields *
sizeof(uint32_t)) + buffer_size();
289 return span<const T>(
reinterpret_cast<const T*
>(array().data()), raw_size);
294#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
295 static_assert(sizeof(pw::InlineVarLenEntryQueue<max_size_bytes>) == \
296 _PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes) * sizeof(uint32_t));
300#define _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes)
318#define PW_VARIABLE_LENGTH_ENTRY_QUEUE_DECLARE(variable, max_size_bytes) \
319 _PW_VAR_QUEUE_CHECK_SIZE(max_size_bytes) \
320 uint32_t variable[_PW_VAR_QUEUE_SIZE_UINT32(max_size_bytes)] = { \
321 PW_VAR_QUEUE_DATA_SIZE_BYTES(max_size_bytes), 0u, 0u}
323typedef uint32_t* pw_InlineVarLenEntryQueue_Handle;
324typedef const uint32_t* pw_InlineVarLenEntryQueue_ConstHandle;
331 pw_InlineVarLenEntryQueue_Handle queue);
335 pw_InlineVarLenEntryQueue_ConstHandle queue);
339 pw_InlineVarLenEntryQueue_Handle queue);
343 pw_InlineVarLenEntryQueue_ConstHandle queue);
347 pw_InlineVarLenEntryQueue_ConstHandle queue);
351 pw_InlineVarLenEntryQueue_ConstHandle queue);
355 pw_InlineVarLenEntryQueue_ConstHandle queue);
359 pw_InlineVarLenEntryQueue_ConstHandle queue);
363 pw_InlineVarLenEntryQueue_ConstHandle queue);
368 uint32_t data_size_bytes);
373 const uint32_t data_size_bytes);
377 pw_InlineVarLenEntryQueue_Handle queue,
379 uint32_t data_size_bytes);
389 pw_InlineVarLenEntryQueue_ConstHandle queue);
393 pw_InlineVarLenEntryQueue_ConstHandle from,
394 pw_InlineVarLenEntryQueue_Handle to);
398 pw_InlineVarLenEntryQueue_ConstHandle from,
399 pw_InlineVarLenEntryQueue_Handle to);
403 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
407 pw_InlineVarLenEntryQueue_Handle from, pw_InlineVarLenEntryQueue_Handle to);
Definition: inline_var_len_entry_queue.h:157
Definition: inline_var_len_entry_queue.h:94
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