tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
inplace_vector.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_INPLACE_VECTOR_INPLACE_VECTOR_HPP
4#define TETL_INPLACE_VECTOR_INPLACE_VECTOR_HPP
5
6#include <etl/_config/all.hpp>
7
29#include <etl/_utility/move.hpp>
31
32namespace etl {
33
36template <typename T, etl::size_t Capacity>
38 using value_type = T;
43 using pointer = T*;
44 using const_pointer = T const*;
45 using iterator = T*;
46 using const_iterator = T const*;
49
50 constexpr inplace_vector() = default;
51
54 = default;
55
57 {
58 etl::uninitialized_copy(other.begin(), other.end(), begin());
59 _size = other._size; // NOLINT(cppcoreguidelines-prefer-member-initializer)
60 }
61
64 = default;
65
67 {
68 etl::uninitialized_move(other.begin(), other.end(), begin());
69 _size = etl::exchange(other._size, internal_size_t{}); // NOLINT(cppcoreguidelines-prefer-member-initializer)
70 }
71
74 = default;
75
76 constexpr ~inplace_vector() { etl::ranges::destroy(*this); }
77
78 [[nodiscard]] constexpr auto begin() const noexcept -> T const* { return data(); }
79
80 [[nodiscard]] constexpr auto begin() noexcept -> T* { return data(); }
81
82 [[nodiscard]] constexpr auto end() const noexcept -> T const*
83 {
84 return etl::next(begin(), static_cast<etl::ptrdiff_t>(size()));
85 }
86
87 [[nodiscard]] constexpr auto end() noexcept -> T*
88 {
89 return etl::next(begin(), static_cast<etl::ptrdiff_t>(size()));
90 }
91
92 [[nodiscard]] constexpr auto data() const noexcept -> T const* { return _storage.data(); }
93
94 [[nodiscard]] constexpr auto data() noexcept -> T* { return _storage.data(); }
95
96 [[nodiscard]] constexpr auto empty() const noexcept -> bool { return size() == 0; }
97
98 [[nodiscard]] constexpr auto size() const noexcept -> etl::size_t { return static_cast<etl::size_t>(_size); }
99
100 [[nodiscard]] static constexpr auto capacity() noexcept -> etl::size_t { return Capacity; }
101
102 [[nodiscard]] static constexpr auto max_size() noexcept -> etl::size_t { return Capacity; }
103
104 [[nodiscard]] constexpr auto front() -> reference
105 {
107 return *begin();
108 }
109
110 [[nodiscard]] constexpr auto front() const -> const_reference
111 {
113 return *begin();
114 }
115
116 [[nodiscard]] constexpr auto back() -> reference
117 {
119 return *etl::prev(end());
120 }
121
122 [[nodiscard]] constexpr auto back() const -> const_reference
123 {
125 return *etl::prev(end());
126 }
127
128 [[nodiscard]] constexpr auto operator[](size_type n) -> reference
129 {
130 TETL_PRECONDITION(n < size());
131 return *etl::next(data(), static_cast<etl::ptrdiff_t>(n));
132 }
133
134 [[nodiscard]] constexpr auto operator[](size_type n) const -> const_reference
135 {
136 TETL_PRECONDITION(n < size());
137 return *etl::next(data(), static_cast<etl::ptrdiff_t>(n));
138 }
139
140 template <typename... Args>
141 constexpr auto try_emplace_back(Args&&... args) -> T*
142 {
143 if (size() == capacity()) {
144 return nullptr;
145 }
147 }
148
149 constexpr auto try_push_back(T const& val) -> T*
150 {
151 if (size() == capacity()) {
152 return nullptr;
153 }
154
156 }
157
158 constexpr auto try_push_back(T&& val) -> T*
159 {
160 if (size() == capacity()) {
161 return nullptr;
162 }
163
165 }
166
167 template <typename... Args>
168 constexpr auto unchecked_emplace_back(Args&&... args) -> T&
169 {
172 unsafe_set_size(size() + 1U);
173 return back();
174 }
175
176 constexpr auto unchecked_push_back(T const& val) -> T&
177 {
180 unsafe_set_size(size() + 1U);
181 return back();
182 }
183
184 constexpr auto unchecked_push_back(T&& val) -> T&
185 {
188 unsafe_set_size(size() + 1U);
189 return back();
190 }
191
192 constexpr auto pop_back() -> void
193 {
196 unsafe_set_size(size() - 1U);
197 }
198
199 constexpr auto clear() noexcept -> void
200 {
202 unsafe_set_size(0);
203 }
204
205private:
206 constexpr auto unsafe_set_size(size_type newSize) noexcept -> void
207 {
208 TETL_PRECONDITION(newSize <= max_size());
209 _size = static_cast<internal_size_t>(newSize);
210 }
211
212 using internal_size_t = etl::smallest_size_t<Capacity>;
214 TETL_NO_UNIQUE_ADDRESS internal_size_t _size;
215};
216
217template <typename T>
218struct inplace_vector<T, 0> {
219 using value_type = T;
224 using pointer = T*;
225 using const_pointer = T const*;
226 using iterator = T*;
227 using const_iterator = T const*;
230
231 constexpr inplace_vector() = default;
232
233 [[nodiscard]] constexpr auto begin() const noexcept -> T const* { return data(); }
234
235 [[nodiscard]] constexpr auto begin() noexcept -> T* { return data(); }
236
237 [[nodiscard]] constexpr auto end() const noexcept -> T const* { return nullptr; }
238
239 [[nodiscard]] constexpr auto end() noexcept -> T* { return nullptr; }
240
241 [[nodiscard]] constexpr auto data() const noexcept -> T const* { return nullptr; }
242
243 [[nodiscard]] constexpr auto data() noexcept -> T* { return nullptr; }
244
245 [[nodiscard]] constexpr auto empty() const noexcept -> bool { return size() == 0; }
246
247 [[nodiscard]] constexpr auto size() const noexcept -> etl::size_t { return 0; }
248
249 [[nodiscard]] static constexpr auto capacity() noexcept -> etl::size_t { return 0; }
250
251 [[nodiscard]] static constexpr auto max_size() noexcept -> etl::size_t { return 0; }
252
253 [[nodiscard]] constexpr auto front() -> reference { etl::unreachable(); }
254
255 [[nodiscard]] constexpr auto front() const -> const_reference { etl::unreachable(); }
256
257 [[nodiscard]] constexpr auto back() -> reference { etl::unreachable(); }
258
259 [[nodiscard]] constexpr auto back() const -> const_reference { etl::unreachable(); }
260
261 [[nodiscard]] constexpr auto operator[](size_type /*n*/) -> reference { etl::unreachable(); }
262
263 [[nodiscard]] constexpr auto operator[](size_type /*n*/) const -> const_reference { etl::unreachable(); }
264
265 constexpr auto try_push_back(T const& /*val*/) -> T* { return nullptr; }
266
267 constexpr auto try_push_back(T&& /*val*/) -> T* { return nullptr; }
268
269 template <typename... Args>
270 constexpr auto try_emplace_back(Args&&... /*args*/) -> T*
271 {
272 return nullptr;
273 }
274
275 constexpr auto unchecked_push_back(T const& /*val*/) -> T& { etl::unreachable(); }
276
277 constexpr auto unchecked_push_back(T&& /*val*/) -> T& { etl::unreachable(); }
278
279 template <typename... Args>
280 constexpr auto unchecked_emplace_back(Args&&... /*args*/) -> T&
281 {
283 }
284
285 constexpr auto pop_back() -> void { etl::unreachable(); }
286
287 constexpr auto clear() noexcept -> void { }
288};
289
290} // namespace etl
291
292#endif // TETL_INPLACE_VECTOR_INPLACE_VECTOR_HPP
#define TETL_TRIVIAL_ABI
Definition attributes.hpp:47
#define TETL_NO_UNIQUE_ADDRESS
Definition attributes.hpp:41
#define TETL_PRECONDITION(...)
Definition check.hpp:16
constexpr auto move(InputIt first, InputIt last, OutputIt destination) -> OutputIt
Moves the elements in the range [first, last), to another range beginning at destination,...
Definition move.hpp:26
constexpr auto prev(BidirIt it, typename iterator_traits< BidirIt >::difference_type n=1) -> BidirIt
Return the nth predecessor of iterator it.
Definition prev.hpp:14
constexpr auto next(InputIt it, typename iterator_traits< InputIt >::difference_type n=1) -> InputIt
Return the nth successor of iterator it.
Definition next.hpp:14
conditional_t<(N< static_cast< unsigned char >(-1)), unsigned char, conditional_t<(N< static_cast< unsigned short >(-1)), unsigned short, conditional_t<(N< static_cast< unsigned int >(-1)), unsigned int, conditional_t<(N< static_cast< unsigned long >(-1)), unsigned long, unsigned long long > > > > smallest_size_t
Smallest unsigned integer type that can represent values in the range [0, N].
Definition smallest_size_t.hpp:13
constexpr struct etl::ranges::construct_at_fn construct_at
constexpr struct etl::ranges::destroy_at_fn destroy_at
constexpr struct etl::ranges::destroy_fn destroy
Definition adjacent_find.hpp:8
constexpr bool is_nothrow_copy_constructible_v
Definition is_nothrow_copy_constructible.hpp:27
constexpr auto addressof(T &arg) noexcept -> T *
Obtains the actual address of the object or function arg, even in presence of overloaded operator&.
Definition addressof.hpp:15
constexpr bool is_nothrow_move_constructible_v
Definition is_nothrow_move_constructible.hpp:20
constexpr auto uninitialized_copy(InputIt first, InputIt last, NoThrowForwardIt dest) -> NoThrowForwardIt
Definition uninitialized_copy.hpp:13
constexpr bool is_trivially_destructible_v
Definition is_trivially_destructible.hpp:33
constexpr auto exchange(T &obj, U &&newValue) noexcept(etl::is_nothrow_move_constructible_v< T > and etl::is_nothrow_assignable_v< T &, U >) -> T
Replaces the value of obj with new_value and returns the old value of obj.
Definition exchange.hpp:16
constexpr bool is_trivially_copy_constructible_v
Definition is_trivially_copy_constructible.hpp:27
constexpr auto is_trivially_move_constructible_v
Definition is_trivially_move_constructible.hpp:20
TETL_BUILTIN_PTRDIFF ptrdiff_t
etl::ptrdiff_t is the signed integer type of the result of subtracting two pointers.
Definition ptrdiff_t.hpp:14
auto unreachable() -> void
Definition unreachable.hpp:10
constexpr auto forward(remove_reference_t< T > &param) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18
TETL_BUILTIN_SIZET size_t
etl::size_t is the unsigned integer type of the result of the sizeof operator.
Definition size_t.hpp:14
constexpr auto uninitialized_move(InputIt first, InputIt last, NoThrowForwardIt dest) -> NoThrowForwardIt
Definition uninitialized_move.hpp:14
constexpr auto try_push_back(T &&) -> T *
Definition inplace_vector.hpp:267
constexpr auto data() const noexcept -> T const *
Definition inplace_vector.hpp:241
constexpr auto unchecked_push_back(T &&) -> T &
Definition inplace_vector.hpp:277
constexpr auto try_emplace_back(Args &&...) -> T *
Definition inplace_vector.hpp:270
constexpr auto back() const -> const_reference
Definition inplace_vector.hpp:259
etl::ptrdiff_t difference_type
Definition inplace_vector.hpp:221
constexpr auto unchecked_push_back(T const &) -> T &
Definition inplace_vector.hpp:275
constexpr auto pop_back() -> void
Definition inplace_vector.hpp:285
etl::size_t size_type
Definition inplace_vector.hpp:220
constexpr auto operator[](size_type) -> reference
Definition inplace_vector.hpp:261
constexpr auto unchecked_emplace_back(Args &&...) -> T &
Definition inplace_vector.hpp:280
constexpr auto front() -> reference
Definition inplace_vector.hpp:253
etl::reverse_iterator< const_iterator > const_reverse_iterator
Definition inplace_vector.hpp:229
static constexpr auto capacity() noexcept -> etl::size_t
Definition inplace_vector.hpp:249
value_type const & const_reference
Definition inplace_vector.hpp:223
T * iterator
Definition inplace_vector.hpp:226
constexpr inplace_vector()=default
T const * const_iterator
Definition inplace_vector.hpp:227
value_type & reference
Definition inplace_vector.hpp:222
constexpr auto begin() noexcept -> T *
Definition inplace_vector.hpp:235
constexpr auto data() noexcept -> T *
Definition inplace_vector.hpp:243
constexpr auto begin() const noexcept -> T const *
Definition inplace_vector.hpp:233
constexpr auto front() const -> const_reference
Definition inplace_vector.hpp:255
constexpr auto empty() const noexcept -> bool
Definition inplace_vector.hpp:245
constexpr auto clear() noexcept -> void
Definition inplace_vector.hpp:287
constexpr auto try_push_back(T const &) -> T *
Definition inplace_vector.hpp:265
etl::reverse_iterator< iterator > reverse_iterator
Definition inplace_vector.hpp:228
constexpr auto end() const noexcept -> T const *
Definition inplace_vector.hpp:237
T * pointer
Definition inplace_vector.hpp:224
constexpr auto back() -> reference
Definition inplace_vector.hpp:257
T const * const_pointer
Definition inplace_vector.hpp:225
static constexpr auto max_size() noexcept -> etl::size_t
Definition inplace_vector.hpp:251
constexpr auto size() const noexcept -> etl::size_t
Definition inplace_vector.hpp:247
constexpr auto end() noexcept -> T *
Definition inplace_vector.hpp:239
constexpr auto operator[](size_type) const -> const_reference
Definition inplace_vector.hpp:263
T value_type
Definition inplace_vector.hpp:219
constexpr auto data() const noexcept -> T const *
Definition inplace_vector.hpp:92
constexpr auto back() const -> const_reference
Definition inplace_vector.hpp:122
constexpr inplace_vector(inplace_vector const &other) noexcept(etl::is_nothrow_copy_constructible_v< T >)
Definition inplace_vector.hpp:56
etl::ptrdiff_t difference_type
Definition inplace_vector.hpp:40
constexpr auto pop_back() -> void
Definition inplace_vector.hpp:192
etl::size_t size_type
Definition inplace_vector.hpp:39
constexpr auto front() -> reference
Definition inplace_vector.hpp:104
etl::reverse_iterator< const_iterator > const_reverse_iterator
Definition inplace_vector.hpp:48
constexpr auto unchecked_emplace_back(Args &&... args) -> T &
Definition inplace_vector.hpp:168
static constexpr auto capacity() noexcept -> etl::size_t
Definition inplace_vector.hpp:100
value_type const & const_reference
Definition inplace_vector.hpp:42
constexpr auto try_push_back(T &&val) -> T *
Definition inplace_vector.hpp:158
T * iterator
Definition inplace_vector.hpp:45
constexpr inplace_vector()=default
constexpr auto operator[](size_type n) -> reference
Definition inplace_vector.hpp:128
constexpr inplace_vector(inplace_vector &&other) noexcept(etl::is_nothrow_move_constructible_v< T >)
Definition inplace_vector.hpp:66
T const * const_iterator
Definition inplace_vector.hpp:46
inplace_vector(inplace_vector const &other)=default
constexpr auto unchecked_push_back(T const &val) -> T &
Definition inplace_vector.hpp:176
value_type & reference
Definition inplace_vector.hpp:41
constexpr auto begin() noexcept -> T *
Definition inplace_vector.hpp:80
constexpr auto data() noexcept -> T *
Definition inplace_vector.hpp:94
constexpr auto begin() const noexcept -> T const *
Definition inplace_vector.hpp:78
constexpr auto front() const -> const_reference
Definition inplace_vector.hpp:110
constexpr auto empty() const noexcept -> bool
Definition inplace_vector.hpp:96
inplace_vector(inplace_vector &&other)=default
constexpr auto clear() noexcept -> void
Definition inplace_vector.hpp:199
etl::reverse_iterator< iterator > reverse_iterator
Definition inplace_vector.hpp:47
constexpr auto unchecked_push_back(T &&val) -> T &
Definition inplace_vector.hpp:184
constexpr auto end() const noexcept -> T const *
Definition inplace_vector.hpp:82
T * pointer
Definition inplace_vector.hpp:43
~inplace_vector()=default
constexpr auto back() -> reference
Definition inplace_vector.hpp:116
constexpr auto try_emplace_back(Args &&... args) -> T *
Definition inplace_vector.hpp:141
constexpr auto try_push_back(T const &val) -> T *
Definition inplace_vector.hpp:149
T const * const_pointer
Definition inplace_vector.hpp:44
static constexpr auto max_size() noexcept -> etl::size_t
Definition inplace_vector.hpp:102
constexpr auto size() const noexcept -> etl::size_t
Definition inplace_vector.hpp:98
constexpr auto end() noexcept -> T *
Definition inplace_vector.hpp:87
constexpr auto operator[](size_type n) const -> const_reference
Definition inplace_vector.hpp:134
T value_type
Definition inplace_vector.hpp:38
reverse_iterator is an iterator adaptor that reverses the direction of a given iterator....
Definition reverse_iterator.hpp:22
Definition uninitialized_array.hpp:25