19#include "pw_async2/context.h"
20#include "pw_async2/poll.h"
21#include "pw_async2/try.h"
22#include "pw_containers/inline_deque.h"
23#include "pw_containers/internal/async_count_and_capacity.h"
24#include "pw_containers/internal/raw_storage.h"
25#include "pw_toolchain/constexpr_tag.h"
32template <
typename T,
typename SizeType,
size_t kCapacity>
33class BasicInlineAsyncDeque;
42template <
typename T,
size_t kCapacity = containers::
internal::kGenericSized>
56template <
typename ValueType,
58 size_t kCapacity = containers::internal::kGenericSized>
60 :
public containers::internal::RawStorage<
61 BasicInlineAsyncDeque<ValueType,
63 containers::internal::kGenericSized>,
69 containers::internal::kGenericSized>;
72 using typename Base::const_iterator;
73 using typename Base::const_pointer;
74 using typename Base::const_reference;
75 using typename Base::difference_type;
76 using typename Base::iterator;
77 using typename Base::pointer;
78 using typename Base::reference;
79 using typename Base::size_type;
80 using typename Base::value_type;
87 Base::assign(count, value);
96 typename InputIterator,
97 typename = containers::internal::EnableIfInputIterator<InputIterator>>
99 Base::assign(start, finish);
108 template <
size_t kOtherCapacity>
116 *
this = std::move(other);
120 template <
size_t kOtherCapacity>
124 *
this = std::move(other);
133 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
150 const std::initializer_list<value_type>& list) {
151 Base::operator=(list);
157 Base::operator=(
static_cast<const Base&
>(other));
164 template <
size_t kOtherCapacity>
167 Base::operator=(
static_cast<const Base&
>(other));
173 Base::operator=(
static_cast<Base&&
>(std::move(other)));
178 template <
size_t kOtherCapacity>
182 Base::operator=(
static_cast<Base&&
>(std::move(other)));
188 static constexpr size_type max_size() {
return capacity(); }
189 static constexpr size_type capacity() {
return kCapacity; }
196 using Base::PendHasSpace;
199 using Base::PendNotEmpty;
212template <
typename ValueType,
typename SizeType>
215 containers::internal::kGenericSized>
218 containers::internal::AsyncCountAndCapacity<SizeType>,
219 containers::internal::kGenericSized> {
224 containers::internal::kGenericSized>;
227 using typename Base::const_iterator;
228 using typename Base::const_pointer;
229 using typename Base::const_reference;
230 using typename Base::difference_type;
231 using typename Base::iterator;
232 using typename Base::pointer;
233 using typename Base::reference;
234 using typename Base::size_type;
235 using typename Base::value_type;
238 Base::assign(other.begin(), other.end());
244 for (
auto&& item : other) {
245 Base::emplace_back(std::move(item));
251 using Base::operator=;
254 return Base::count_and_capacity().PendHasSpace(context, num);
258 return Base::count_and_capacity().PendNotEmpty(context);
267 ~BasicInlineAsyncDeque() =
default;
270 static constexpr bool kFixedCapacity =
true;
Definition: inline_async_deque.h:219
Definition: inline_async_deque.h:65
BasicInlineAsyncDeque(InputIterator start, InputIterator finish)
Copy constructs from an iterator.
Definition: inline_async_deque.h:98
BasicInlineAsyncDeque(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:109
async2::Poll PendHasSpace(async2::Context &context, size_type num=1)
Returns pw::async2::Pending until space for num elements is available.
Definition: inline_async_deque.h:253
BasicInlineAsyncDeque(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move constructs for mismatched capacity.
Definition: inline_async_deque.h:121
BasicInlineAsyncDeque(const BasicInlineAsyncDeque &other)
Copy constructs for matching capacity.
Definition: inline_async_deque.h:103
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque &&other) noexcept
Move assigns for matching capacity.
Definition: inline_async_deque.h:172
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move assigns for mismatched capacity.
Definition: inline_async_deque.h:179
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque &other)
Copy assigns for matching capacity.
Definition: inline_async_deque.h:156
constexpr BasicInlineAsyncDeque() noexcept=default
Constructs with zero elements.
BasicInlineAsyncDeque(BasicInlineAsyncDeque &&other) noexcept
Move constructs for matching capacity.
Definition: inline_async_deque.h:115
BasicInlineAsyncDeque(const T &other)
Copy constructor for arbitrary iterables.
Definition: inline_async_deque.h:134
BasicInlineAsyncDeque(size_type count)
Constructs with count default-initialized elements.
Definition: inline_async_deque.h:91
BasicInlineAsyncDeque & operator=(const std::initializer_list< value_type > &list)
Copy assigns from list.
Definition: inline_async_deque.h:149
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:165
async2::Poll PendNotEmpty(async2::Context &context)
Returns pw::async2::Pending until an element is available.
Definition: inline_async_deque.h:257
BasicInlineAsyncDeque(const std::initializer_list< value_type > &list)
Copy constructs from an initializer list.
Definition: inline_async_deque.h:128
Definition: async_count_and_capacity.h:35
Definition: inline_deque.h:77
The Pigweed namespace.
Definition: alignment.h:27