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"
30template <
typename T,
typename SizeType,
size_t kCapacity>
31class BasicInlineAsyncDeque;
37template <
typename T,
size_t kCapacity = containers::
internal::kGenericSized>
40template <
typename ValueType,
42 size_t kCapacity = containers::internal::kGenericSized>
44 :
public containers::internal::RawStorage<
45 BasicInlineAsyncDeque<ValueType,
47 containers::internal::kGenericSized>,
53 containers::internal::kGenericSized>;
56 using typename Base::const_iterator;
57 using typename Base::const_pointer;
58 using typename Base::const_reference;
59 using typename Base::difference_type;
60 using typename Base::iterator;
61 using typename Base::pointer;
62 using typename Base::reference;
63 using typename Base::size_type;
64 using typename Base::value_type;
71 Base::assign(count, value);
80 typename InputIterator,
81 typename = containers::internal::EnableIfInputIterator<InputIterator>>
83 Base::assign(start, finish);
92 template <
size_t kOtherCapacity>
100 *
this = std::move(other);
104 template <
size_t kOtherCapacity>
108 *
this = std::move(other);
117 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
134 const std::initializer_list<value_type>& list) {
135 Base::operator=(list);
141 Base::operator=(
static_cast<const Base&
>(other));
148 template <
size_t kOtherCapacity>
151 Base::operator=(
static_cast<const Base&
>(other));
157 Base::operator=(
static_cast<Base&&
>(std::move(other)));
162 template <
size_t kOtherCapacity>
166 Base::operator=(
static_cast<Base&&
>(std::move(other)));
172 static constexpr size_type max_size() {
return capacity(); }
173 static constexpr size_type capacity() {
return kCapacity; }
184template <
typename ValueType,
typename SizeType>
187 containers::internal::kGenericSized>
190 containers::internal::AsyncCountAndCapacity<SizeType>,
191 containers::internal::kGenericSized> {
195 containers::internal::AsyncCountAndCapacity<SizeType>,
196 containers::internal::kGenericSized>;
199 using typename Base::const_iterator;
200 using typename Base::const_pointer;
201 using typename Base::const_reference;
202 using typename Base::difference_type;
203 using typename Base::iterator;
204 using typename Base::pointer;
205 using typename Base::reference;
206 using typename Base::size_type;
207 using typename Base::value_type;
210 Base::assign(other.begin(), other.end());
216 for (
auto&& item : other) {
217 Base::emplace_back(std::move(item));
223 using Base::operator=;
227 return Base::count_and_capacity().PendHasSpace(context, num);
232 return Base::count_and_capacity().PendNotEmpty(context);
241 ~BasicInlineAsyncDeque() =
default;
244 static constexpr bool kFixedCapacity =
true;
Definition: inline_async_deque.h:191
async2::Poll PendHasSpace(async2::Context &context, size_type num=1)
Returns Pending until space for num elements is available.
Definition: inline_async_deque.h:226
async2::Poll PendNotEmpty(async2::Context &context)
Returns Pending until an element is available.
Definition: inline_async_deque.h:231
Definition: inline_async_deque.h:49
BasicInlineAsyncDeque(InputIterator start, InputIterator finish)
Copy constructs from an iterator.
Definition: inline_async_deque.h:82
BasicInlineAsyncDeque(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:93
BasicInlineAsyncDeque(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move constructs for mismatched capacity.
Definition: inline_async_deque.h:105
BasicInlineAsyncDeque(const BasicInlineAsyncDeque &other)
Copy constructs for matching capacity.
Definition: inline_async_deque.h:87
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque &&other) noexcept
Move assigns for matching capacity.
Definition: inline_async_deque.h:156
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move assigns for mismatched capacity.
Definition: inline_async_deque.h:163
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque &other)
Copy assigns for matching capacity.
Definition: inline_async_deque.h:140
constexpr BasicInlineAsyncDeque() noexcept=default
Constructs with zero elements.
BasicInlineAsyncDeque(BasicInlineAsyncDeque &&other) noexcept
Move constructs for matching capacity.
Definition: inline_async_deque.h:99
BasicInlineAsyncDeque(const T &other)
Copy constructor for arbitrary iterables.
Definition: inline_async_deque.h:118
BasicInlineAsyncDeque(size_type count)
Constructs with count default-initialized elements.
Definition: inline_async_deque.h:75
BasicInlineAsyncDeque & operator=(const std::initializer_list< value_type > &list)
Copy assigns from list.
Definition: inline_async_deque.h:133
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:149
BasicInlineAsyncDeque(const std::initializer_list< value_type > &list)
Copy constructs from an initializer list.
Definition: inline_async_deque.h:112
Definition: inline_deque.h:73
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27