16#include <initializer_list>
19#include "pw_allocator/allocator.h"
20#include "pw_containers/dynamic_deque.h"
21#include "pw_containers/ptr_iterator.h"
52template <
typename T,
typename SizeType = u
int16_t>
56 using size_type = SizeType;
57 using reference = value_type&;
58 using const_reference =
const value_type&;
59 using pointer = value_type*;
60 using const_pointer =
const value_type*;
63 using reverse_iterator = std::reverse_iterator<iterator>;
64 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
80 iterator begin() {
return iterator(
data()); }
81 const_iterator begin()
const {
return cbegin(); }
82 const_iterator cbegin()
const {
return const_iterator(
data()); }
84 iterator end() {
return iterator(
data() +
size()); }
85 const_iterator end()
const {
return cend(); }
86 const_iterator cend()
const {
return const_iterator(
data() +
size()); }
88 reverse_iterator rbegin() {
return reverse_iterator(end()); }
89 const_reverse_iterator rbegin()
const {
return crbegin(); }
90 const_reverse_iterator crbegin()
const {
91 return const_reverse_iterator(end());
94 reverse_iterator rend() {
return reverse_iterator(begin()); }
95 const_reverse_iterator rend()
const {
return crend(); }
96 const_reverse_iterator crend()
const {
97 return const_reverse_iterator(begin());
108 bool empty()
const {
return deque_.empty(); }
118 size_type
max_size()
const {
return deque_.max_size(); }
185 reference
at(size_type pos) {
return deque_.at(pos); }
194 const_reference
at(size_type pos)
const {
return deque_.at(pos); }
199 reference
front() {
return deque_.front(); }
204 const_reference
front()
const {
return deque_.front(); }
209 reference
back() {
return deque_.back(); }
214 const_reference
back()
const {
return deque_.back(); }
222 pointer
data() {
return deque_.data(); }
229 const_pointer
data()
const {
return deque_.data(); }
238 void assign(size_type count,
const value_type& value) {
239 deque_.
assign(count, value);
242 [[nodiscard]]
bool try_assign(size_type count,
const value_type& value) {
252 [[nodiscard]]
bool try_assign(std::initializer_list<T> init) {
260 void push_back(
const value_type& value) { deque_.push_back(value); }
266 void push_back(value_type&& value) { deque_.push_back(std::move(value)); }
275 return deque_.try_push_back(value);
285 return deque_.try_push_back(std::move(value));
297 template <
typename... Args>
299 deque_.emplace_back(std::forward<Args>(args)...);
308 template <
typename... Args>
310 return deque_.try_emplace_back(std::forward<Args>(args)...);
320 template <
typename... Args>
322 auto deque_it = deque_.try_emplace_shift_right(ToDequeIterator(pos),
323 std::forward<Args>(args)...);
324 PW_ASSERT(deque_it.has_value());
336 template <
typename... Args>
339 auto deque_it = deque_.try_emplace_shift_right(ToDequeIterator(pos),
340 std::forward<Args>(args)...);
341 if (!deque_it.has_value()) {
366 return emplace(pos, std::move(value));
379 deque_.try_insert_shift_right(ToDequeIterator(pos), count, value);
380 PW_ASSERT(deque_it.has_value());
392 template <
typename InputIt>
395 deque_.try_insert_shift_right(ToDequeIterator(pos), first, last);
396 PW_ASSERT(deque_it.has_value());
408 return insert(pos, ilist.begin(), ilist.end());
452 deque_.try_insert_shift_right(ToDequeIterator(pos), count, value);
453 if (!deque_it.has_value()) {
470 template <
typename InputIt>
475 deque_.try_insert_shift_right(ToDequeIterator(pos), first, last);
476 if (!deque_it.has_value()) {
494 return try_insert(pos, ilist.begin(), ilist.end());
504 auto deque_it = deque_.
erase(ToDequeIterator(pos));
514 auto deque_it = deque_.
erase(ToDequeIterator(first), ToDequeIterator(last));
525 void resize(size_type count) { deque_.resize(count); }
536 void resize(size_type count,
const value_type& value) {
537 deque_.resize(count, value);
545 return deque_.try_resize(count);
554 [[nodiscard]]
bool try_resize(size_type count,
const value_type& value) {
555 return deque_.try_resize(count, value);
567 typename DynamicDeque<T, size_type>::const_iterator ToDequeIterator(
568 const_iterator it)
const {
569 return {deque_,
static_cast<size_type
>(it - cbegin())};
573 DynamicDeque<T, size_type> deque_;
Definition: allocator.h:36
bool try_assign(size_type count, const value_type &value)
Definition: generic_deque.h:615
Definition: dynamic_vector.h:53
Definition: ptr_iterator.h:164
Definition: ptr_iterator.h:142
constexpr size_type size() const noexcept
Returns the number of elements in the deque.
Definition: generic_deque.h:64
constexpr size_type capacity() const noexcept
Returns the maximum number of elements in the deque.
Definition: generic_deque.h:69
void reserve(size_type new_capacity)
Increases capacity() to at least new_capacity. Crashes on failure.
Definition: dynamic_deque.h:151
void reserve_exact(size_type new_capacity)
Increases capacity() to exactly new_capacity. Crashes on failure.
Definition: dynamic_deque.h:167
void swap(DynamicDeque &other) noexcept
Swaps the contents of two deques. No allocations occur.
Definition: dynamic_deque.h:182
bool try_reserve(size_type new_capacity)
Definition: dynamic_deque.h:240
void shrink_to_fit()
Attempts to reduce capacity() to size(). Not guaranteed to succeed.
Definition: dynamic_deque.h:261
constexpr allocator_type & get_allocator() const
Returns the deque's allocator.
Definition: dynamic_deque.h:179
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_deque.h:162
iterator erase(const_iterator pos)
Erases the item at pos, which must be a dereferenceable iterator.
Definition: generic_deque.h:305
void assign(size_type count, const value_type &value)
Sets the contents to count copies of value. Crashes if cannot fit.
Definition: generic_deque.h:211
std::optional< iterator > try_insert(const_iterator pos, T &&value)
Definition: dynamic_vector.h:432
iterator insert(const_iterator pos, InputIt first, InputIt last)
Definition: dynamic_vector.h:393
constexpr allocator_type & get_allocator() const
Returns the vector's allocator.
Definition: dynamic_vector.h:103
void clear()
Removes all elements from the vector.
Definition: dynamic_vector.h:559
size_type capacity() const
Definition: dynamic_vector.h:115
std::optional< iterator > try_insert(const_iterator pos, std::initializer_list< T > ilist)
Definition: dynamic_vector.h:492
bool try_resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:554
bool try_emplace_back(Args &&... args)
Definition: dynamic_vector.h:309
reference at(size_type pos)
Definition: dynamic_vector.h:185
reference operator[](size_type pos)
Definition: dynamic_vector.h:168
bool try_reserve(size_type new_capacity)
Definition: dynamic_vector.h:143
std::optional< iterator > try_insert(const_iterator pos, InputIt first, InputIt last)
Definition: dynamic_vector.h:471
const_reference back() const
Definition: dynamic_vector.h:214
iterator insert(const_iterator pos, T &&value)
Definition: dynamic_vector.h:365
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:153
void resize(size_type count)
Definition: dynamic_vector.h:525
void pop_back()
Definition: dynamic_vector.h:291
void emplace_back(Args &&... args)
Definition: dynamic_vector.h:298
std::optional< iterator > try_emplace(const_iterator pos, Args &&... args)
Definition: dynamic_vector.h:337
iterator insert(const_iterator pos, std::initializer_list< T > ilist)
Definition: dynamic_vector.h:407
iterator insert(const_iterator pos, size_type count, const T &value)
Definition: dynamic_vector.h:377
reference front()
Definition: dynamic_vector.h:199
reference back()
Definition: dynamic_vector.h:209
size_type max_size() const
Maximum possible value of size(), ignoring allocator limitations.
Definition: dynamic_vector.h:118
void reserve(size_type new_capacity)
Definition: dynamic_vector.h:125
const_reference operator[](size_type pos) const
Definition: dynamic_vector.h:176
const_pointer data() const
Definition: dynamic_vector.h:229
void resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:536
bool try_push_back(value_type &&value)
Definition: dynamic_vector.h:284
iterator insert(const_iterator pos, const T &value)
Definition: dynamic_vector.h:354
std::optional< iterator > try_insert(const_iterator pos, const T &value)
Definition: dynamic_vector.h:419
void shrink_to_fit()
Reduces memory usage by releasing unused capacity.
Definition: dynamic_vector.h:158
void push_back(value_type &&value)
Definition: dynamic_vector.h:266
std::optional< iterator > try_insert(const_iterator pos, size_type count, const T &value)
Definition: dynamic_vector.h:448
const_reference front() const
Definition: dynamic_vector.h:204
constexpr DynamicVector(Allocator &allocator)
Definition: dynamic_vector.h:70
void push_back(const value_type &value)
Definition: dynamic_vector.h:260
bool try_push_back(const value_type &value)
Definition: dynamic_vector.h:274
void reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:132
iterator erase(const_iterator pos)
Definition: dynamic_vector.h:503
pointer data()
Definition: dynamic_vector.h:222
size_type size() const
Returns the number of elements in the vector.
Definition: dynamic_vector.h:111
const_reference at(size_type pos) const
Definition: dynamic_vector.h:194
iterator erase(const_iterator first, const_iterator last)
Definition: dynamic_vector.h:513
void assign(size_type count, const value_type &value)
Definition: dynamic_vector.h:238
bool empty() const
Checks if the vector is empty.
Definition: dynamic_vector.h:108
void swap(DynamicVector &other)
Definition: dynamic_vector.h:564
iterator emplace(const_iterator pos, Args &&... args)
Definition: dynamic_vector.h:321
void assign(std::initializer_list< T > init)
Definition: dynamic_vector.h:250
bool try_resize(size_type count)
Definition: dynamic_vector.h:544
The Pigweed namespace.
Definition: alignment.h:27