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_preprocessor/compiler.h"
26#include "pw_toolchain/constexpr_tag.h"
36template <
typename T,
typename SizeType,
size_t kCapacity>
37class BasicInlineAsyncDeque;
49template <
typename T,
size_t kCapacity = containers::
internal::kGenericSized>
68template <
typename ValueType,
70 size_t kCapacity = containers::internal::kGenericSized>
72 "Use pw_async2 Channels instead "
74 :
public containers::internal::RawStorage<
75 BasicInlineAsyncDeque<ValueType,
77 containers::internal::kGenericSized>,
83 containers::internal::kGenericSized>;
86 using typename Base::const_iterator;
87 using typename Base::const_pointer;
88 using typename Base::const_reference;
89 using typename Base::difference_type;
90 using typename Base::iterator;
91 using typename Base::pointer;
92 using typename Base::reference;
93 using typename Base::size_type;
94 using typename Base::value_type;
101 Base::assign(count, value);
110 typename InputIterator,
111 typename = containers::internal::EnableIfInputIterator<InputIterator>>
113 Base::assign(start, finish);
122 template <
size_t kOtherCapacity>
130 *
this = std::move(other);
134 template <
size_t kOtherCapacity>
138 *
this = std::move(other);
147 template <
typename T,
typename = containers::
internal::EnableIfIterable<T>>
164 const std::initializer_list<value_type>& list) {
165 Base::operator=(list);
171 Base::operator=(
static_cast<const Base&
>(other));
178 template <
size_t kOtherCapacity>
181 Base::operator=(
static_cast<const Base&
>(other));
187 Base::operator=(
static_cast<Base&&
>(std::move(other)));
192 template <
size_t kOtherCapacity>
196 Base::operator=(
static_cast<Base&&
>(std::move(other)));
202 static constexpr size_type max_size() {
return capacity(); }
203 static constexpr size_type capacity() {
return kCapacity; }
210 using Base::PendHasSpace;
213 using Base::PendNotEmpty;
226template <
typename ValueType,
typename SizeType>
229 containers::internal::kGenericSized>
232 containers::internal::AsyncCountAndCapacity<SizeType>,
233 containers::internal::kGenericSized> {
238 containers::internal::kGenericSized>;
241 using typename Base::const_iterator;
242 using typename Base::const_pointer;
243 using typename Base::const_reference;
244 using typename Base::difference_type;
245 using typename Base::iterator;
246 using typename Base::pointer;
247 using typename Base::reference;
248 using typename Base::size_type;
249 using typename Base::value_type;
252 Base::assign(other.begin(), other.end());
258 for (
auto&& item : other) {
259 Base::emplace_back(std::move(item));
265 using Base::operator=;
268 return Base::count_and_capacity().PendHasSpace(context, num);
272 return Base::count_and_capacity().PendNotEmpty(context);
281 ~BasicInlineAsyncDeque() =
default;
284 static constexpr bool kFixedCapacity =
true;
Definition: inline_async_deque.h:233
Definition: inline_async_deque.h:79
BasicInlineAsyncDeque(InputIterator start, InputIterator finish)
Copy constructs from an iterator.
Definition: inline_async_deque.h:112
BasicInlineAsyncDeque(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:123
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:267
BasicInlineAsyncDeque(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move constructs for mismatched capacity.
Definition: inline_async_deque.h:135
BasicInlineAsyncDeque(const BasicInlineAsyncDeque &other)
Copy constructs for matching capacity.
Definition: inline_async_deque.h:117
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque &&other) noexcept
Move assigns for matching capacity.
Definition: inline_async_deque.h:186
BasicInlineAsyncDeque & operator=(BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &&other) noexcept
Move assigns for mismatched capacity.
Definition: inline_async_deque.h:193
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque &other)
Copy assigns for matching capacity.
Definition: inline_async_deque.h:170
constexpr BasicInlineAsyncDeque() noexcept=default
Constructs with zero elements.
BasicInlineAsyncDeque(BasicInlineAsyncDeque &&other) noexcept
Move constructs for matching capacity.
Definition: inline_async_deque.h:129
BasicInlineAsyncDeque(const T &other)
Copy constructor for arbitrary iterables.
Definition: inline_async_deque.h:148
BasicInlineAsyncDeque(size_type count)
Constructs with count default-initialized elements.
Definition: inline_async_deque.h:105
BasicInlineAsyncDeque & operator=(const std::initializer_list< value_type > &list)
Copy assigns from list.
Definition: inline_async_deque.h:163
BasicInlineAsyncDeque & operator=(const BasicInlineAsyncDeque< ValueType, SizeType, kOtherCapacity > &other)
Definition: inline_async_deque.h:179
async2::Poll PendNotEmpty(async2::Context &context)
Returns pw::async2::Pending until an element is available.
Definition: inline_async_deque.h:271
BasicInlineAsyncDeque(const std::initializer_list< value_type > &list)
Copy constructs from an initializer list.
Definition: inline_async_deque.h:142
Definition: async_count_and_capacity.h:35
Definition: inline_deque.h:77
#define PW_MODIFY_DIAGNOSTICS_POP()
Definition: compiler.h:194
#define PW_MODIFY_DIAGNOSTIC(kind, option)
Definition: compiler.h:203
#define PW_MODIFY_DIAGNOSTICS_PUSH()
Definition: compiler.h:189
The Pigweed namespace.
Definition: alignment.h:27