16#include <initializer_list>
19#include "pw_allocator/allocator.h"
20#include "pw_containers/dynamic_deque.h"
21#include "pw_containers/ptr_iterator.h"
62template <
typename T,
typename SizeType = u
int16_t>
66 using size_type = SizeType;
67 using reference = value_type&;
68 using const_reference =
const value_type&;
69 using pointer = value_type*;
70 using const_pointer =
const value_type*;
73 using reverse_iterator = std::reverse_iterator<iterator>;
74 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
90 iterator begin() {
return iterator(
data()); }
91 const_iterator begin()
const {
return cbegin(); }
92 const_iterator cbegin()
const {
return const_iterator(
data()); }
94 iterator end() {
return iterator(
data() +
size()); }
95 const_iterator end()
const {
return cend(); }
96 const_iterator cend()
const {
return const_iterator(
data() +
size()); }
98 reverse_iterator rbegin() {
return reverse_iterator(end()); }
99 const_reverse_iterator rbegin()
const {
return crbegin(); }
100 const_reverse_iterator crbegin()
const {
101 return const_reverse_iterator(end());
104 reverse_iterator rend() {
return reverse_iterator(begin()); }
105 const_reverse_iterator rend()
const {
return crend(); }
106 const_reverse_iterator crend()
const {
107 return const_reverse_iterator(begin());
118 bool empty()
const {
return deque_.empty(); }
121 size_type
size()
const {
return deque_.size(); }
125 size_type
capacity()
const {
return deque_.capacity(); }
128 size_type
max_size()
const {
return deque_.max_size(); }
195 reference
at(size_type pos) {
return deque_.at(pos); }
204 const_reference
at(size_type pos)
const {
return deque_.at(pos); }
209 reference
front() {
return deque_.front(); }
214 const_reference
front()
const {
return deque_.front(); }
219 reference
back() {
return deque_.back(); }
224 const_reference
back()
const {
return deque_.back(); }
232 pointer
data() {
return deque_.data(); }
239 const_pointer
data()
const {
return deque_.data(); }
248 void assign(size_type count,
const value_type& value) {
249 deque_.assign(count, value);
252 [[nodiscard]]
bool try_assign(size_type count,
const value_type& value) {
260 void assign(std::initializer_list<T> init) { deque_.assign(init); }
262 [[nodiscard]]
bool try_assign(std::initializer_list<T> init) {
270 void push_back(
const value_type& value) { deque_.push_back(value); }
276 void push_back(value_type&& value) { deque_.push_back(std::move(value)); }
285 return deque_.try_push_back(value);
295 return deque_.try_push_back(std::move(value));
307 template <
typename... Args>
309 deque_.emplace_back(std::forward<Args>(args)...);
318 template <
typename... Args>
320 return deque_.try_emplace_back(std::forward<Args>(args)...);
330 template <
typename... Args>
332 auto deque_it = deque_.try_emplace_shift_right(ToDequeIterator(pos),
333 std::forward<Args>(args)...);
334 PW_ASSERT(deque_it.has_value());
346 template <
typename... Args>
349 auto deque_it = deque_.try_emplace_shift_right(ToDequeIterator(pos),
350 std::forward<Args>(args)...);
351 if (!deque_it.has_value()) {
376 return emplace(pos, std::move(value));
389 deque_.try_insert_shift_right(ToDequeIterator(pos), count, value);
390 PW_ASSERT(deque_it.has_value());
402 template <
typename InputIt>
405 deque_.try_insert_shift_right(ToDequeIterator(pos), first, last);
406 PW_ASSERT(deque_it.has_value());
418 return insert(pos, ilist.begin(), ilist.end());
462 deque_.try_insert_shift_right(ToDequeIterator(pos), count, value);
463 if (!deque_it.has_value()) {
480 template <
typename InputIt>
485 deque_.try_insert_shift_right(ToDequeIterator(pos), first, last);
486 if (!deque_it.has_value()) {
504 return try_insert(pos, ilist.begin(), ilist.end());
521 auto first_ptr =
const_cast<pointer
>(&*first);
523 std::move(
const_cast<pointer
>(&*last),
data() +
size(), first_ptr);
524 size_t items_to_pop =
static_cast<SizeType
>(last - first);
525 for (
size_t i = 0; i < items_to_pop; ++i) {
539 void resize(size_type count) { deque_.resize(count); }
550 void resize(size_type count,
const value_type& value) {
551 deque_.resize(count, value);
559 return deque_.try_resize(count);
568 [[nodiscard]]
bool try_resize(size_type count,
const value_type& value) {
569 return deque_.try_resize(count, value);
584 typename DynamicDeque<T, size_type>::const_iterator ToDequeIterator(
585 const_iterator it)
const {
586 return {deque_,
static_cast<size_type
>(it - cbegin())};
590 DynamicDeque<T, size_type> deque_;
Definition: allocator.h:42
bool try_assign(size_type count, const value_type &value)
Definition: generic_deque.h:618
Definition: dynamic_vector.h:63
Definition: ptr_iterator.h:164
Definition: ptr_iterator.h:142
void reserve(size_type new_capacity)
Increases capacity() to at least new_capacity. Crashes on failure.
Definition: dynamic_deque.h:157
void reserve_exact(size_type new_capacity)
Increases capacity() to exactly new_capacity. Crashes on failure.
Definition: dynamic_deque.h:173
void swap(DynamicDeque &other) noexcept
Swaps the contents of two deques. No allocations occur.
Definition: dynamic_deque.h:203
bool try_reserve(size_type new_capacity)
Definition: dynamic_deque.h:269
void shrink_to_fit()
Definition: dynamic_deque.h:290
constexpr allocator_type & get_allocator() const
Returns the deque's allocator.
Definition: dynamic_deque.h:200
void reset()
Clears the deque and deallocates its buffer.
Definition: dynamic_deque.h:190
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_deque.h:168
std::optional< iterator > try_insert(const_iterator pos, T &&value)
Definition: dynamic_vector.h:442
iterator insert(const_iterator pos, InputIt first, InputIt last)
Definition: dynamic_vector.h:403
constexpr allocator_type & get_allocator() const
Returns the vector's allocator.
Definition: dynamic_vector.h:113
void clear()
Removes all elements from the vector.
Definition: dynamic_vector.h:573
size_type capacity() const
Definition: dynamic_vector.h:125
std::optional< iterator > try_insert(const_iterator pos, std::initializer_list< T > ilist)
Definition: dynamic_vector.h:502
bool try_resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:568
bool try_emplace_back(Args &&... args)
Definition: dynamic_vector.h:319
reference at(size_type pos)
Definition: dynamic_vector.h:195
reference operator[](size_type pos)
Definition: dynamic_vector.h:178
bool try_reserve(size_type new_capacity)
Definition: dynamic_vector.h:153
std::optional< iterator > try_insert(const_iterator pos, InputIt first, InputIt last)
Definition: dynamic_vector.h:481
const_reference back() const
Definition: dynamic_vector.h:224
iterator insert(const_iterator pos, T &&value)
Definition: dynamic_vector.h:375
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:163
void resize(size_type count)
Definition: dynamic_vector.h:539
void pop_back()
Definition: dynamic_vector.h:301
void emplace_back(Args &&... args)
Definition: dynamic_vector.h:308
std::optional< iterator > try_emplace(const_iterator pos, Args &&... args)
Definition: dynamic_vector.h:347
iterator insert(const_iterator pos, std::initializer_list< T > ilist)
Definition: dynamic_vector.h:417
iterator insert(const_iterator pos, size_type count, const T &value)
Definition: dynamic_vector.h:387
reference front()
Definition: dynamic_vector.h:209
reference back()
Definition: dynamic_vector.h:219
size_type max_size() const
Maximum possible value of size(), ignoring allocator limitations.
Definition: dynamic_vector.h:128
void reserve(size_type new_capacity)
Definition: dynamic_vector.h:135
const_reference operator[](size_type pos) const
Definition: dynamic_vector.h:186
const_pointer data() const
Definition: dynamic_vector.h:239
void resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:550
bool try_push_back(value_type &&value)
Definition: dynamic_vector.h:294
iterator insert(const_iterator pos, const T &value)
Definition: dynamic_vector.h:364
std::optional< iterator > try_insert(const_iterator pos, const T &value)
Definition: dynamic_vector.h:429
void shrink_to_fit()
Reduces memory usage by releasing unused capacity.
Definition: dynamic_vector.h:168
void push_back(value_type &&value)
Definition: dynamic_vector.h:276
std::optional< iterator > try_insert(const_iterator pos, size_type count, const T &value)
Definition: dynamic_vector.h:458
const_reference front() const
Definition: dynamic_vector.h:214
constexpr DynamicVector(Allocator &allocator)
Definition: dynamic_vector.h:80
void push_back(const value_type &value)
Definition: dynamic_vector.h:270
bool try_push_back(const value_type &value)
Definition: dynamic_vector.h:284
void reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:142
iterator erase(const_iterator pos)
Definition: dynamic_vector.h:513
pointer data()
Definition: dynamic_vector.h:232
void reset()
Clears the deque and deallocates its buffer.
Definition: dynamic_vector.h:576
size_type size() const
Returns the number of elements in the vector.
Definition: dynamic_vector.h:121
const_reference at(size_type pos) const
Definition: dynamic_vector.h:204
iterator erase(const_iterator first, const_iterator last)
Definition: dynamic_vector.h:520
void assign(size_type count, const value_type &value)
Definition: dynamic_vector.h:248
bool empty() const
Checks if the vector is empty.
Definition: dynamic_vector.h:118
void swap(DynamicVector &other)
Definition: dynamic_vector.h:581
iterator emplace(const_iterator pos, Args &&... args)
Definition: dynamic_vector.h:331
void assign(std::initializer_list< T > init)
Definition: dynamic_vector.h:260
bool try_resize(size_type count)
Definition: dynamic_vector.h:558
The Pigweed namespace.
Definition: alignment.h:27