4#ifndef TETL_INPLACE_VECTOR_INPLACE_VECTOR_HPP
5#define TETL_INPLACE_VECTOR_INPLACE_VECTOR_HPP
7#include <etl/_config/all.hpp>
9#include <etl/_array/uninitialized_array.hpp>
10#include <etl/_contracts/check.hpp>
11#include <etl/_cstddef/ptrdiff_t.hpp>
12#include <etl/_cstddef/size_t.hpp>
13#include <etl/_iterator/next.hpp>
14#include <etl/_iterator/prev.hpp>
15#include <etl/_iterator/reverse_iterator.hpp>
16#include <etl/_memory/ranges_construct_at.hpp>
17#include <etl/_memory/ranges_destroy.hpp>
18#include <etl/_memory/ranges_destroy_at.hpp>
19#include <etl/_memory/uninitialized_copy.hpp>
20#include <etl/_memory/uninitialized_move.hpp>
21#include <etl/_type_traits/conditional.hpp>
22#include <etl/_type_traits/is_nothrow_copy_constructible.hpp>
23#include <etl/_type_traits/is_nothrow_move_constructible.hpp>
24#include <etl/_type_traits/is_trivially_copy_constructible.hpp>
25#include <etl/_type_traits/is_trivially_destructible.hpp>
26#include <etl/_type_traits/is_trivially_move_constructible.hpp>
27#include <etl/_type_traits/smallest_size_t.hpp>
28#include <etl/_utility/exchange.hpp>
29#include <etl/_utility/forward.hpp>
30#include <etl/_utility/move.hpp>
31#include <etl/_utility/unreachable.hpp>
37template <
typename T,
etl::size_t Capacity>
40 using size_type =
etl::size_t;
41 using difference_type =
etl::ptrdiff_t;
42 using reference = value_type&;
43 using const_reference = value_type
const&;
45 using const_pointer = T
const*;
47 using const_iterator = T
const*;
48 using reverse_iterator =
etl::reverse_iterator<iterator>;
49 using const_reverse_iterator =
etl::reverse_iterator<const_iterator>;
54 requires etl::is_trivially_copy_constructible_v<T>
59 etl::uninitialized_copy(other.begin(), other.end(), begin());
64 requires etl::is_trivially_move_constructible_v<T>
69 etl::uninitialized_move(other.begin(), other.end(), begin());
70 _size =
etl::exchange(other._size, internal_size_t{});
74 requires etl::is_trivially_destructible_v<T>
94 return etl::next(begin(),
static_cast<
etl::ptrdiff_t>(
size()));
99 return etl::next(begin(),
static_cast<
etl::ptrdiff_t>(
size()));
104 return _storage.data();
109 return _storage.data();
119 return static_cast<
etl::size_t>(_size);
134 TETL_PRECONDITION(
not empty());
140 TETL_PRECONDITION(
not empty());
146 TETL_PRECONDITION(
not empty());
147 return *
etl::prev(end());
152 TETL_PRECONDITION(
not empty());
153 return *
etl::prev(end());
158 TETL_PRECONDITION(n < size());
159 return *
etl::next(data(),
static_cast<
etl::ptrdiff_t>(n));
164 TETL_PRECONDITION(n < size());
165 return *
etl::next(data(),
static_cast<
etl::ptrdiff_t>(n));
168 template <
typename... Args>
174 return etl::addressof(unchecked_emplace_back(
etl::forward<Args>(args)...));
183 return etl::addressof(unchecked_push_back(val));
192 return etl::addressof(unchecked_push_back(
etl::move(val)));
195 template <
typename... Args>
198 TETL_PRECONDITION(size() != max_size());
199 etl::
ranges::construct_at(end(),
etl::forward<Args>(args)...);
200 unsafe_set_size(
size() + 1U);
206 TETL_PRECONDITION(size() != max_size());
208 unsafe_set_size(
size() + 1U);
214 TETL_PRECONDITION(size() != max_size());
216 unsafe_set_size(
size() + 1U);
222 TETL_PRECONDITION(
not empty());
224 unsafe_set_size(
size() - 1U);
227 constexpr auto clear()
noexcept ->
void
234 constexpr auto unsafe_set_size(size_type newSize)
noexcept ->
void
236 TETL_PRECONDITION(newSize <= max_size());
237 _size =
static_cast<internal_size_t>(newSize);
240 using internal_size_t =
etl::smallest_size_t<Capacity>;
247 using value_type = T;
248 using size_type =
etl::size_t;
249 using difference_type =
etl::ptrdiff_t;
250 using reference = value_type&;
251 using const_reference = value_type
const&;
253 using const_pointer = T
const*;
255 using const_iterator = T
const*;
256 using reverse_iterator =
etl::reverse_iterator<iterator>;
257 using const_reverse_iterator =
etl::reverse_iterator<const_iterator>;
351 template <
typename... Args>
367 template <
typename... Args>
378 constexpr auto clear()
noexcept ->
void { }
Definition ranges_in_fun_result.hpp:12
Definition adjacent_find.hpp:9
auto unreachable() -> void
Definition unreachable.hpp:11
constexpr auto try_push_back(T &&) -> T *
Definition inplace_vector.hpp:346
constexpr auto data() const noexcept -> T const *
Definition inplace_vector.hpp:281
constexpr auto unchecked_push_back(T &&) -> T &
Definition inplace_vector.hpp:362
constexpr auto try_emplace_back(Args &&...) -> T *
Definition inplace_vector.hpp:352
constexpr auto back() const -> const_reference
Definition inplace_vector.hpp:326
constexpr auto unchecked_push_back(T const &) -> T &
Definition inplace_vector.hpp:357
constexpr auto pop_back() -> void
Definition inplace_vector.hpp:373
constexpr auto operator[](size_type) -> reference
Definition inplace_vector.hpp:331
constexpr auto unchecked_emplace_back(Args &&...) -> T &
Definition inplace_vector.hpp:368
constexpr auto front() -> reference
Definition inplace_vector.hpp:311
static constexpr auto capacity() noexcept -> etl::size_t
Definition inplace_vector.hpp:301
constexpr inplace_vector()=default
constexpr auto begin() noexcept -> T *
Definition inplace_vector.hpp:266
constexpr auto data() noexcept -> T *
Definition inplace_vector.hpp:286
constexpr auto begin() const noexcept -> T const *
Definition inplace_vector.hpp:261
constexpr auto front() const -> const_reference
Definition inplace_vector.hpp:316
constexpr auto empty() const noexcept -> bool
Definition inplace_vector.hpp:291
constexpr auto clear() noexcept -> void
Definition inplace_vector.hpp:378
constexpr auto try_push_back(T const &) -> T *
Definition inplace_vector.hpp:341
constexpr auto end() const noexcept -> T const *
Definition inplace_vector.hpp:271
constexpr auto back() -> reference
Definition inplace_vector.hpp:321
static constexpr auto max_size() noexcept -> etl::size_t
Definition inplace_vector.hpp:306
constexpr auto size() const noexcept -> etl::size_t
Definition inplace_vector.hpp:296
constexpr auto end() noexcept -> T *
Definition inplace_vector.hpp:276
constexpr auto operator[](size_type) const -> const_reference
Definition inplace_vector.hpp:336
Definition inplace_vector.hpp:38
constexpr auto data() const noexcept -> T const *
Definition inplace_vector.hpp:102
constexpr auto back() const -> const_reference
Definition inplace_vector.hpp:150
constexpr auto pop_back() -> void
Definition inplace_vector.hpp:220
constexpr auto front() -> reference
Definition inplace_vector.hpp:132
constexpr auto unchecked_emplace_back(Args &&... args) -> T &
Definition inplace_vector.hpp:196
static constexpr auto capacity() noexcept -> etl::size_t
Definition inplace_vector.hpp:122
constexpr auto try_push_back(T &&val) -> T *
Definition inplace_vector.hpp:186
constexpr inplace_vector()=default
constexpr ~inplace_vector()
Definition inplace_vector.hpp:77
constexpr auto operator[](size_type n) -> reference
Definition inplace_vector.hpp:156
inplace_vector(inplace_vector const &other)=default
constexpr auto unchecked_push_back(T const &val) -> T &
Definition inplace_vector.hpp:204
constexpr auto begin() noexcept -> T *
Definition inplace_vector.hpp:87
constexpr auto data() noexcept -> T *
Definition inplace_vector.hpp:107
constexpr auto begin() const noexcept -> T const *
Definition inplace_vector.hpp:82
constexpr auto front() const -> const_reference
Definition inplace_vector.hpp:138
constexpr auto empty() const noexcept -> bool
Definition inplace_vector.hpp:112
inplace_vector(inplace_vector &&other)=default
constexpr auto clear() noexcept -> void
Definition inplace_vector.hpp:227
constexpr auto unchecked_push_back(T &&val) -> T &
Definition inplace_vector.hpp:212
constexpr auto end() const noexcept -> T const *
Definition inplace_vector.hpp:92
constexpr auto back() -> reference
Definition inplace_vector.hpp:144
constexpr auto try_emplace_back(Args &&... args) -> T *
Definition inplace_vector.hpp:169
constexpr auto try_push_back(T const &val) -> T *
Definition inplace_vector.hpp:177
static constexpr auto max_size() noexcept -> etl::size_t
Definition inplace_vector.hpp:127
constexpr auto size() const noexcept -> etl::size_t
Definition inplace_vector.hpp:117
constexpr auto end() noexcept -> T *
Definition inplace_vector.hpp:97
constexpr auto operator[](size_type n) const -> const_reference
Definition inplace_vector.hpp:162
Definition uninitialized_array.hpp:26