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;
35template <
typename T,
typename SizeType,
size_t kCapacity>
36class BasicInlineQueue;
46template <
typename T,
size_t kCapacity = containers::
internal::kGenericSized>
49template <
typename ValueType,
51 size_t kCapacity = containers::internal::kGenericSized>
55 containers::internal::kGenericSized> {
59 containers::internal::kGenericSized>;
62 using typename Base::const_iterator;
63 using typename Base::const_pointer;
64 using typename Base::const_reference;
65 using typename Base::difference_type;
66 using typename Base::iterator;
67 using typename Base::pointer;
68 using typename Base::reference;
69 using typename Base::size_type;
70 using typename Base::value_type;
80 : deque_(constexpr_tag) {}
83 : deque_(count, value) {}
88 typename InputIterator,
89 typename = containers::internal::EnableIfInputIterator<InputIterator>>
91 : deque_(start, finish) {}
102 template <
size_t kOtherCapacity>
110 : deque_(std::move(other.deque_)) {}
115 template <
size_t kOtherCapacity>
118 *
this = std::move(other);
121 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
124 BasicInlineQueue& operator=(
const std::initializer_list<value_type>& list) {
125 deque_ = std::move(list);
131 deque_ = other.deque_;
138 template <
size_t kOtherCapacity>
141 deque_ = other.deque_;
147 deque_ = std::move(other.deque_);
154 template <
size_t kOtherCapacity>
157 deque_ = std::move(other.deque_);
161 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
170 static constexpr size_type max_size() {
return capacity(); }
171 static constexpr size_type capacity() {
return kCapacity; }
174 template <
typename OtherValueType,
typename OtherSizeType,
size_t kOtherSized>
175 friend class BasicInlineQueue;
177 template <
typename,
typename>
178 friend class containers::internal::BasicInlineQueueImpl;
184 BasicInlineDeque<ValueType, SizeType>& deque() {
return deque_; }
185 const BasicInlineDeque<ValueType, SizeType>& deque()
const {
return deque_; }
187 BasicInlineDeque<ValueType, SizeType, kCapacity> deque_;
195template <
typename ValueType,
typename SizeType>
198 BasicInlineQueue<ValueType,
200 containers::internal::kGenericSized>,
201 BasicInlineDeque<ValueType, SizeType>> {
207 containers::internal::kGenericSized>,
211 using typename Base::const_iterator;
212 using typename Base::const_pointer;
213 using typename Base::const_reference;
214 using typename Base::difference_type;
215 using typename Base::iterator;
216 using typename Base::pointer;
217 using typename Base::reference;
218 using typename Base::size_type;
219 using typename Base::value_type;
229 template <
typename,
typename>
230 friend class containers::internal::GenericQueue;
232 template <
size_t kCapacity>
241 const Deque& deque()
const {
242 return static_cast<const Derived<0>*
>(
this)->deque();
248namespace containers::internal {
250template <
typename Derived,
typename Deque>
253 using Base = GenericQueue<Derived, Deque>;
256 using typename Base::const_iterator;
257 using typename Base::const_pointer;
258 using typename Base::const_reference;
259 using typename Base::difference_type;
260 using typename Base::iterator;
261 using typename Base::pointer;
262 using typename Base::reference;
263 using typename Base::size_type;
264 using typename Base::value_type;
268 reference at(size_type index) {
return deque().at(index); }
269 const_reference at(size_type index)
const {
return deque().at(index); }
271 reference operator[](size_type index) {
return deque()[index]; }
272 const_reference operator[](size_type index)
const {
return deque()[index]; }
276 return deque().contiguous_data();
279 return deque().contiguous_data();
284 iterator begin()
noexcept {
return deque().begin(); }
285 const_iterator begin()
const noexcept {
return cbegin(); }
286 const_iterator cbegin()
const noexcept {
return deque().cbegin(); }
288 iterator end()
noexcept {
return deque().end(); }
289 const_iterator end()
const noexcept {
return cend(); }
290 const_iterator cend()
const noexcept {
return deque().cend(); }
294 [[nodiscard]]
bool full()
const noexcept {
return deque().full(); }
298 void clear()
noexcept { deque().clear(); }
300 void push_overwrite(
const value_type& value) { emplace_overwrite(value); }
302 void push_overwrite(value_type&& value) {
303 emplace_overwrite(std::move(value));
306 template <
typename... Args>
307 void emplace_overwrite(Args&&... args) {
311 Base::emplace(std::forward<Args>(args)...);
Definition: inline_queue.h:201
Definition: inline_queue.h:55
Definition: inline_deque.h:77
Definition: inline_queue.h:251
Definition: span_impl.h:235
BasicInlineQueue & operator=(BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &&other)
Definition: inline_queue.h:155
BasicInlineQueue & operator=(const BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_queue.h:139
BasicInlineQueue & operator=(BasicInlineQueue &&other)
Move assigns from matching capacity.
Definition: inline_queue.h:146
BasicInlineQueue & operator=(const BasicInlineQueue &other)
Copy assigns from matching capacity.
Definition: inline_queue.h:130
BasicInlineQueue(BasicInlineQueue &&other)
Move constructs for matching capacity.
Definition: inline_queue.h:109
BasicInlineQueue(BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &&other)
Definition: inline_queue.h:116
BasicInlineQueue(const BasicInlineQueue< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_queue.h:103
BasicInlineQueue(const BasicInlineQueue &other)
Copy constructs for matching capacity.
Definition: inline_queue.h:97
The Pigweed namespace.
Definition: alignment.h:27
Definition: constexpr_tag.h:48