16#include <initializer_list>
19#include "pw_allocator/allocator.h"
20#include "pw_containers/dynamic_deque.h"
21#include "pw_containers/ptr_iterator.h"
47template <
typename T,
typename SizeType = u
int16_t>
51 using size_type = SizeType;
52 using reference = value_type&;
53 using const_reference =
const value_type&;
54 using pointer = value_type*;
55 using const_pointer =
const value_type*;
58 using reverse_iterator = std::reverse_iterator<iterator>;
59 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
75 iterator begin() {
return iterator(
data()); }
76 const_iterator begin()
const {
return cbegin(); }
77 const_iterator cbegin()
const {
return const_iterator(
data()); }
79 iterator end() {
return iterator(
data() +
size()); }
80 const_iterator end()
const {
return cend(); }
81 const_iterator cend()
const {
return const_iterator(
data() +
size()); }
83 reverse_iterator rbegin() {
return reverse_iterator(end()); }
84 const_reverse_iterator rbegin()
const {
return crbegin(); }
85 const_reverse_iterator crbegin()
const {
86 return const_reverse_iterator(end());
89 reverse_iterator rend() {
return reverse_iterator(begin()); }
90 const_reverse_iterator rend()
const {
return crend(); }
91 const_reverse_iterator crend()
const {
92 return const_reverse_iterator(begin());
103 bool empty()
const {
return deque_.empty(); }
113 size_type
max_size()
const {
return deque_.max_size(); }
180 reference
at(size_type pos) {
return deque_.at(pos); }
189 const_reference
at(size_type pos)
const {
return deque_.at(pos); }
194 reference
front() {
return deque_.front(); }
199 const_reference
front()
const {
return deque_.front(); }
204 reference
back() {
return deque_.back(); }
209 const_reference
back()
const {
return deque_.back(); }
217 pointer
data() {
return deque_.data(); }
224 const_pointer
data()
const {
return deque_.data(); }
233 void assign(size_type count,
const value_type& value) {
234 deque_.
assign(count, value);
237 [[nodiscard]]
bool try_assign(size_type count,
const value_type& value) {
247 [[nodiscard]]
bool try_assign(std::initializer_list<T> init) {
255 void push_back(
const value_type& value) { deque_.push_back(value); }
261 void push_back(value_type&& value) { deque_.push_back(std::move(value)); }
270 return deque_.try_push_back(value);
280 return deque_.try_push_back(std::move(value));
292 template <
typename... Args>
294 deque_.emplace_back(std::forward<Args>(args)...);
303 template <
typename... Args>
305 return deque_.try_emplace_back(std::forward<Args>(args)...);
315 auto deque_it = deque_.
erase(ToDequeIterator(pos));
325 auto deque_it = deque_.
erase(ToDequeIterator(first), ToDequeIterator(last));
336 void resize(size_type count) { deque_.resize(count); }
347 void resize(size_type count,
const value_type& value) {
348 deque_.resize(count, value);
356 return deque_.try_resize(count);
365 [[nodiscard]]
bool try_resize(size_type count,
const value_type& value) {
366 return deque_.try_resize(count, value);
378 typename DynamicDeque<T, size_type>::const_iterator ToDequeIterator(
379 const_iterator it)
const {
380 return {deque_,
static_cast<size_type
>(it - cbegin())};
384 DynamicDeque<T, size_type> deque_;
Definition: allocator.h:34
void reserve(size_type new_capacity)
Increases capacity() to at least new_capacity. Crashes on failure.
Definition: dynamic_deque.h:146
void reserve_exact(size_type new_capacity)
Increases capacity() to exactly new_capacity. Crashes on failure.
Definition: dynamic_deque.h:162
void swap(DynamicDeque &other) noexcept
Swaps the contents of two deques. No allocations occur.
Definition: dynamic_deque.h:177
bool try_reserve(size_type new_capacity)
Definition: dynamic_deque.h:235
bool try_assign(size_type count, const value_type &value)
Definition: generic_deque.h:612
void shrink_to_fit()
Attempts to reduce capacity() to size(). Not guaranteed to succeed.
Definition: dynamic_deque.h:256
constexpr allocator_type & get_allocator() const
Returns the deque's allocator.
Definition: dynamic_deque.h:174
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_deque.h:157
Definition: dynamic_vector.h:48
constexpr allocator_type & get_allocator() const
Returns the vector's allocator.
Definition: dynamic_vector.h:98
void clear()
Removes all elements from the vector.
Definition: dynamic_vector.h:370
size_type capacity() const
Definition: dynamic_vector.h:110
bool try_resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:365
bool try_emplace_back(Args &&... args)
Definition: dynamic_vector.h:304
reference at(size_type pos)
Definition: dynamic_vector.h:180
reference operator[](size_type pos)
Definition: dynamic_vector.h:163
bool try_reserve(size_type new_capacity)
Definition: dynamic_vector.h:138
const_reference back() const
Definition: dynamic_vector.h:209
bool try_reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:148
void resize(size_type count)
Definition: dynamic_vector.h:336
void pop_back()
Definition: dynamic_vector.h:286
void emplace_back(Args &&... args)
Definition: dynamic_vector.h:293
reference front()
Definition: dynamic_vector.h:194
reference back()
Definition: dynamic_vector.h:204
size_type max_size() const
Maximum possible value of size(), ignoring allocator limitations.
Definition: dynamic_vector.h:113
void reserve(size_type new_capacity)
Definition: dynamic_vector.h:120
const_reference operator[](size_type pos) const
Definition: dynamic_vector.h:171
const_pointer data() const
Definition: dynamic_vector.h:224
void resize(size_type count, const value_type &value)
Definition: dynamic_vector.h:347
bool try_push_back(value_type &&value)
Definition: dynamic_vector.h:279
void shrink_to_fit()
Reduces memory usage by releasing unused capacity.
Definition: dynamic_vector.h:153
void push_back(value_type &&value)
Definition: dynamic_vector.h:261
const_reference front() const
Definition: dynamic_vector.h:199
constexpr DynamicVector(Allocator &allocator)
Definition: dynamic_vector.h:65
void push_back(const value_type &value)
Definition: dynamic_vector.h:255
bool try_push_back(const value_type &value)
Definition: dynamic_vector.h:269
void reserve_exact(size_type new_capacity)
Definition: dynamic_vector.h:127
iterator erase(const_iterator pos)
Definition: dynamic_vector.h:314
pointer data()
Definition: dynamic_vector.h:217
size_type size() const
Returns the number of elements in the vector.
Definition: dynamic_vector.h:106
const_reference at(size_type pos) const
Definition: dynamic_vector.h:189
iterator erase(const_iterator first, const_iterator last)
Definition: dynamic_vector.h:324
void assign(size_type count, const value_type &value)
Definition: dynamic_vector.h:233
bool empty() const
Checks if the vector is empty.
Definition: dynamic_vector.h:103
void swap(DynamicVector &other)
Definition: dynamic_vector.h:375
void assign(std::initializer_list< T > init)
Definition: dynamic_vector.h:245
bool try_resize(size_type count)
Definition: dynamic_vector.h:355
Definition: ptr_iterator.h:159
Definition: ptr_iterator.h:137
constexpr size_type size() const noexcept
Returns the number of elements in the deque.
Definition: generic_deque.h:58
iterator erase(const_iterator pos)
Erases the item at pos, which must be a dereferenceable iterator.
Definition: generic_deque.h:314
constexpr size_type capacity() const noexcept
Returns the maximum number of elements in the deque.
Definition: generic_deque.h:63
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:220
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27