C/C++ API Reference
Loading...
Searching...
No Matches
var_len_entry_queue_iterator.h
1// Copyright 2025 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#include "pw_containers/internal/var_len_entry.h"
17#include "pw_preprocessor/util.h"
18
19#ifndef __cplusplus
20
21#include <stdbool.h>
22#include <stddef.h>
23#include <stdint.h>
24
25#else // __cplusplus
26
27#include <cstddef>
28#include <cstdint>
29#include <iterator>
30
31#include "pw_containers/internal/wrap.h"
32#include "pw_span/span.h"
33
34#endif // __cplusplus
35
36// Forward declarations of C structs.
41
42#ifdef __cplusplus
43namespace pw::containers::internal {
44
45template <typename T>
47 public:
48 using difference_type = std::ptrdiff_t;
50 using size_type = uint32_t;
51 using pointer = const value_type*;
52 using reference = const value_type&;
53 using iterator_category = std::forward_iterator_tag;
54
55 static_assert(std::is_same_v<size_type, typename VarLenEntry<T>::size_type>);
56
57 constexpr VarLenEntryQueueIterator() {}
58
59 constexpr VarLenEntryQueueIterator(const VarLenEntryQueueIterator&) = default;
60 constexpr VarLenEntryQueueIterator& operator=(
61 const VarLenEntryQueueIterator&) = default;
62
67 size_type entry_size = ReadVarLenEntryEncodedSize(data_, offset_);
68 IncrementWithWrap(
69 offset_, entry_size, static_cast<size_type>(data_.size()));
70 entry_ = value_type{}; // mark the entry as unloaded
71 return *this;
72 }
73
75 VarLenEntryQueueIterator previous_value(*this);
76 operator++();
77 return previous_value;
78 }
79
83 constexpr reference operator*() const {
84 LoadEntry();
85 return entry_;
86 }
87 constexpr pointer operator->() const {
88 LoadEntry();
89 return &entry_;
90 }
91
95 [[nodiscard]] friend constexpr bool operator==(
96 const VarLenEntryQueueIterator& lhs,
97 const VarLenEntryQueueIterator& rhs) {
98 return lhs.data_.data() == rhs.data_.data() &&
99 lhs.data_.size() == rhs.data_.size() && lhs.offset_ == rhs.offset_;
100 }
101 [[nodiscard]] friend constexpr bool operator!=(
102 const VarLenEntryQueueIterator& lhs,
103 const VarLenEntryQueueIterator& rhs) {
104 return !(lhs == rhs);
105 }
106
107 private:
108 using SpanType = span<T>;
109
110 template <typename, typename>
111 friend class GenericVarLenEntryQueue;
112
113 friend class VarLenEntryQueueIteratorC;
114
115 constexpr VarLenEntryQueueIterator(SpanType data, size_t offset)
116 : data_(data), offset_(static_cast<size_type>(offset)) {}
117
118 constexpr void LoadEntry() const;
119
120 SpanType data_;
121 size_type offset_ = 0;
122 mutable value_type entry_;
123};
124
126// Template method implementations.
127
128template <typename T>
129constexpr void VarLenEntryQueueIterator<T>::LoadEntry() const {
130 if (!entry_.empty()) {
131 return;
132 }
133 auto [prefix_size, data_size] = ReadVarLenEntrySize(data_, offset_);
134 size_type offset = offset_;
135 IncrementWithWrap(offset, prefix_size, static_cast<size_type>(data_.size()));
136 size_t first_chunk = data_.size() - offset;
137 if (data_size <= first_chunk) {
138 entry_ = VarLenEntry<T>(data_.subspan(offset, data_size), SpanType());
139 } else {
140 entry_ = VarLenEntry<T>(data_.subspan(offset, first_chunk),
141 data_.subspan(0, data_size - first_chunk));
142 }
143}
144
145// Helper class with methods to convert between the C++ object and C structs.
147 public:
149 const pw_InlineVarLenEntryQueue_Iterator& iterator);
153 const VarLenEntryQueueIterator<std::byte>& cxx_iterator);
156};
157
158} // namespace pw::containers::internal
159#endif // __cplusplus
160
162// C API.
163
164PW_EXTERN_C_START
165
167 uint8_t* internal_data;
168 uint32_t internal_size;
169 uint32_t internal_offset;
170};
171
173 const uint8_t* internal_data;
174 uint32_t internal_size;
175 uint32_t internal_offset;
176};
177
179void pw_InlineVarLenEntryQueue_Iterator_Advance(
181void pw_InlineVarLenEntryQueue_ConstIterator_Advance(
183
185bool pw_InlineVarLenEntryQueue_Iterator_Equal(
188bool pw_InlineVarLenEntryQueue_ConstIterator_Equal(
191
193pw_InlineVarLenEntryQueue_Entry pw_InlineVarLenEntryQueue_GetEntry(
194 const pw_InlineVarLenEntryQueue_Iterator* iterator);
195pw_InlineVarLenEntryQueue_ConstEntry pw_InlineVarLenEntryQueue_GetConstEntry(
197
198PW_EXTERN_C_END
Refers to an entry in-place in the queue. Entries may be discontiguous.
Definition: var_len_entry.h:65
Definition: var_len_entry_queue_iterator.h:146
Definition: var_len_entry_queue_iterator.h:46
constexpr VarLenEntryQueueIterator & operator++()
Definition: var_len_entry_queue_iterator.h:66
friend constexpr bool operator==(const VarLenEntryQueueIterator &lhs, const VarLenEntryQueueIterator &rhs)
Definition: var_len_entry_queue_iterator.h:95
constexpr reference operator*() const
Definition: var_len_entry_queue_iterator.h:83
Definition: span_impl.h:235
Definition: var_len_entry.h:245
Definition: var_len_entry_queue_iterator.h:172
Definition: var_len_entry.h:238
Definition: var_len_entry_queue_iterator.h:166