16#include <initializer_list>
19#include "pw_containers/inline_deque.h"
20#include "pw_containers/internal/generic_queue.h"
23namespace containers::internal {
25template <
typename Derived,
typename Deque>
26class BasicInlineQueueImpl;
30template <
typename T,
typename SizeType,
size_t kCapacity>
31class BasicInlineQueue;
41template <
typename T,
size_t kCapacity = containers::
internal::kGenericSized>
44template <
typename ValueType,
46 size_t kCapacity = containers::internal::kGenericSized>
50 containers::internal::kGenericSized> {
54 containers::internal::kGenericSized>;
57 using typename Base::const_iterator;
58 using typename Base::const_pointer;
59 using typename Base::const_reference;
60 using typename Base::difference_type;
61 using typename Base::iterator;
62 using typename Base::pointer;
63 using typename Base::reference;
64 using typename Base::size_type;
65 using typename Base::value_type;
75 : deque_(constexpr_tag) {}
78 : deque_(count, value) {}
83 typename InputIterator,
84 typename = containers::internal::EnableIfInputIterator<InputIterator>>
86 : deque_(start, finish) {}
97 template <
size_t kOtherCapacity>
105 : deque_(std::move(other.deque_)) {}
110 template <
size_t kOtherCapacity>
113 *
this = std::move(other);
116 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
119 BasicInlineQueue& operator=(
const std::initializer_list<value_type>& list) {
120 deque_ = std::move(list);
126 deque_ = other.deque_;
133 template <
size_t kOtherCapacity>
136 deque_ = other.deque_;
142 deque_ = std::move(other.deque_);
149 template <
size_t kOtherCapacity>
152 deque_ = std::move(other.deque_);
156 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
165 static constexpr size_type max_size() {
return capacity(); }
166 static constexpr size_type capacity() {
return kCapacity; }
169 template <
typename OtherValueType,
typename OtherSizeType,
size_t kOtherSized>
170 friend class BasicInlineQueue;
172 template <
typename,
typename>
173 friend class containers::internal::BasicInlineQueueImpl;
179 BasicInlineDeque<ValueType, SizeType>& deque() {
return deque_; }
180 const BasicInlineDeque<ValueType, SizeType>& deque()
const {
return deque_; }
182 BasicInlineDeque<ValueType, SizeType, kCapacity> deque_;
190template <
typename ValueType,
typename SizeType>
193 BasicInlineQueue<ValueType,
195 containers::internal::kGenericSized>,
196 BasicInlineDeque<ValueType, SizeType>> {
202 containers::internal::kGenericSized>,
206 using typename Base::const_iterator;
207 using typename Base::const_pointer;
208 using typename Base::const_reference;
209 using typename Base::difference_type;
210 using typename Base::iterator;
211 using typename Base::pointer;
212 using typename Base::reference;
213 using typename Base::size_type;
214 using typename Base::value_type;
224 template <
typename,
typename>
225 friend class containers::internal::GenericQueue;
227 template <
size_t kCapacity>
236 const Deque& deque()
const {
237 return static_cast<const Derived<0>*
>(
this)->deque();
241namespace containers::internal {
243template <
typename Derived,
typename Deque>
246 using Base = GenericQueue<Derived, Deque>;
249 using typename Base::const_iterator;
250 using typename Base::const_pointer;
251 using typename Base::const_reference;
252 using typename Base::difference_type;
253 using typename Base::iterator;
254 using typename Base::pointer;
255 using typename Base::reference;
256 using typename Base::size_type;
257 using typename Base::value_type;
261 reference at(size_type index) {
return deque().at(index); }
262 const_reference at(size_type index)
const {
return deque().at(index); }
264 reference operator[](size_type index) {
return deque()[index]; }
265 const_reference operator[](size_type index)
const {
return deque()[index]; }
267 std::pair<span<const value_type>, span<const value_type>> contiguous_data()
269 return deque().contiguous_data();
271 std::pair<span<value_type>, span<value_type>> contiguous_data() {
272 return deque().contiguous_data();
277 iterator begin()
noexcept {
return deque().begin(); }
278 const_iterator begin()
const noexcept {
return cbegin(); }
279 const_iterator cbegin()
const noexcept {
return deque().cbegin(); }
281 iterator end()
noexcept {
return deque().end(); }
282 const_iterator end()
const noexcept {
return cend(); }
283 const_iterator cend()
const noexcept {
return deque().cend(); }
287 [[nodiscard]]
bool full()
const noexcept {
return deque().full(); }
291 void clear()
noexcept { deque().clear(); }
293 void push_overwrite(
const value_type& value) { emplace_overwrite(value); }
295 void push_overwrite(value_type&& value) {
296 emplace_overwrite(std::move(value));
299 template <
typename... Args>
300 void emplace_overwrite(Args&&... args) {
304 Base::emplace(std::forward<Args>(args)...);
Definition: inline_queue.h:196
Definition: inline_queue.h:50
BasicInlineQueue & operator=(BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &&other)
Definition: inline_queue.h:150
BasicInlineQueue & operator=(const BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_queue.h:134
BasicInlineQueue & operator=(BasicInlineQueue &&other)
Move assigns from matching capacity.
Definition: inline_queue.h:141
BasicInlineQueue & operator=(const BasicInlineQueue &other)
Copy assigns from matching capacity.
Definition: inline_queue.h:125
BasicInlineQueue(BasicInlineQueue &&other)
Move constructs for matching capacity.
Definition: inline_queue.h:104
BasicInlineQueue(BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &&other)
Definition: inline_queue.h:111
BasicInlineQueue(const BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_queue.h:98
BasicInlineQueue(const BasicInlineQueue &other)
Copy constructs for matching capacity.
Definition: inline_queue.h:92
Definition: inline_deque.h:73
Definition: inline_queue.h:244
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
Definition: constexpr_tag.h:46