4#ifndef TETL_VECTOR_STATIC_VECTOR_HPP
5#define TETL_VECTOR_STATIC_VECTOR_HPP
7#include <etl/_algorithm/equal_range.hpp>
8#include <etl/_algorithm/find.hpp>
9#include <etl/_algorithm/generate_n.hpp>
10#include <etl/_algorithm/move.hpp>
11#include <etl/_algorithm/remove_if.hpp>
12#include <etl/_algorithm/rotate.hpp>
13#include <etl/_algorithm/transform.hpp>
14#include <etl/_array/array.hpp>
15#include <etl/_array/c_array.hpp>
16#include <etl/_concepts/same_as.hpp>
17#include <etl/_container/index.hpp>
18#include <etl/_contracts/check.hpp>
19#include <etl/_cstdint/uint_t.hpp>
20#include <etl/_functional/is_transparent.hpp>
21#include <etl/_iterator/begin.hpp>
22#include <etl/_iterator/data.hpp>
23#include <etl/_iterator/end.hpp>
24#include <etl/_iterator/rbegin.hpp>
25#include <etl/_iterator/rend.hpp>
26#include <etl/_iterator/size.hpp>
27#include <etl/_new/operator
.hpp>
28#include <etl/_type_traits/aligned_storage.hpp>
29#include <etl/_type_traits/conditional.hpp>
30#include <etl/_type_traits/is_assignable.hpp>
31#include <etl/_type_traits/is_const.hpp>
32#include <etl/_type_traits/is_constructible.hpp>
33#include <etl/_type_traits/is_copy_constructible.hpp>
34#include <etl/_type_traits/is_move_constructible.hpp>
35#include <etl/_type_traits/is_nothrow_copy_constructible.hpp>
36#include <etl/_type_traits/is_nothrow_destructible.hpp>
37#include <etl/_type_traits/is_nothrow_move_constructible.hpp>
38#include <etl/_type_traits/is_pointer.hpp>
39#include <etl/_type_traits/is_trivial.hpp>
40#include <etl/_type_traits/smallest_size_t.hpp>
46struct static_vector_zero_storage {
47 using size_type = uint8_t;
49 using difference_type = ptrdiff_t;
51 using const_pointer = T
const*;
54 constexpr static_vector_zero_storage() =
default;
57 constexpr static_vector_zero_storage(static_vector_zero_storage
const&) =
default;
60 constexpr auto operator=(static_vector_zero_storage
const&)
noexcept -> static_vector_zero_storage& =
default;
63 constexpr static_vector_zero_storage(static_vector_zero_storage&&)
noexcept =
default;
66 constexpr auto operator=(static_vector_zero_storage&&)
noexcept -> static_vector_zero_storage& =
default;
69 ~static_vector_zero_storage() =
default;
72 [[nodiscard]]
static constexpr auto data()
noexcept -> pointer
78 [[nodiscard]]
static constexpr auto size()
noexcept -> size_type
84 [[nodiscard]]
static constexpr auto capacity()
noexcept -> size_type
90 [[nodiscard]]
static constexpr auto empty()
noexcept ->
bool
96 [[nodiscard]]
static constexpr auto full()
noexcept ->
bool
104 template <
typename... Args>
105 requires(is_constructible_v<T, Args...>)
106 static constexpr auto emplace_back(Args&&... )
noexcept ->
void
108 TETL_PRECONDITION(
false);
113 static constexpr void pop_back()
noexcept
115 TETL_PRECONDITION(
false);
122 static constexpr void unsafe_set_size([[maybe_unused]] size_t newSize)
noexcept
124 TETL_PRECONDITION(newSize == 0);
130 template <
typename InputIt>
131 static constexpr auto unsafe_destroy(InputIt , InputIt )
noexcept ->
void
137 static constexpr void unsafe_destroy_all()
noexcept { }
141template <
typename T, size_t Capacity>
142struct static_vector_trivial_storage {
143 static_assert(
etl::is_trivial_v<T>);
144 static_assert(Capacity != size_t{0});
146 using size_type =
etl::smallest_size_t<Capacity>;
147 using value_type = T;
148 using difference_type = ptrdiff_t;
150 using const_pointer = T
const*;
152 constexpr static_vector_trivial_storage()
noexcept =
default;
154 constexpr static_vector_trivial_storage(static_vector_trivial_storage
const&)
noexcept =
default;
155 constexpr auto operator=(static_vector_trivial_storage
const&)
noexcept -> static_vector_trivial_storage& =
default;
157 constexpr static_vector_trivial_storage(static_vector_trivial_storage&&)
noexcept =
default;
158 constexpr auto operator=(static_vector_trivial_storage&&)
noexcept -> static_vector_trivial_storage& =
default;
160 ~static_vector_trivial_storage() =
default;
163 [[nodiscard]]
constexpr auto data()
const noexcept -> const_pointer
169 [[nodiscard]]
constexpr auto data()
noexcept -> pointer
175 [[nodiscard]]
constexpr auto size()
const noexcept -> size_type
182 [[nodiscard]]
constexpr auto capacity()
const noexcept -> size_type
188 [[nodiscard]]
constexpr auto empty()
const noexcept ->
bool
190 return size() == size_type{0};
194 [[nodiscard]]
constexpr auto full()
const noexcept ->
bool
196 return size() == Capacity;
200 template <
typename... Args>
201 requires(is_constructible_v<T, Args...>
and is_assignable_v<value_type&, T>)
202 constexpr auto emplace_back(Args&&... args)
noexcept ->
void
204 TETL_PRECONDITION(!full());
205 index(_data, size()) = T(
etl::forward<Args>(args)...);
206 unsafe_set_size(
static_cast<size_type>(size()) + 1U);
210 constexpr auto pop_back()
noexcept ->
void
212 TETL_PRECONDITION(!empty());
213 unsafe_set_size(
static_cast<size_type>(size() - 1));
220 constexpr auto unsafe_set_size(size_t newSize)
noexcept ->
void
222 TETL_PRECONDITION(newSize <= Capacity);
223 _size = size_type(newSize);
229 template <
typename InputIt>
230 constexpr auto unsafe_destroy(InputIt , InputIt )
noexcept ->
void
237 constexpr auto unsafe_destroy_all()
noexcept ->
void { }
242 using data_t = conditional_t<!is_const_v<T>,
array<T, Capacity>,
array<remove_const_t<T>, Capacity>
const>;
243 alignas(
alignof(T)) data_t _data{};
249template <
typename T, size_t Capacity>
250struct static_vector_non_trivial_storage {
251 static_assert(!is_trivial_v<T>);
252 static_assert(Capacity != size_t{0});
254 using size_type =
etl::smallest_size_t<Capacity>;
255 using value_type = T;
256 using difference_type = ptrdiff_t;
258 using const_pointer = T
const*;
260 static_vector_non_trivial_storage() =
default;
262 static_vector_non_trivial_storage(static_vector_non_trivial_storage
const&) =
default;
263 auto operator=(static_vector_non_trivial_storage
const&) -> static_vector_non_trivial_storage& =
default;
265 static_vector_non_trivial_storage(static_vector_non_trivial_storage&&)
noexcept =
default;
266 auto operator=(static_vector_non_trivial_storage&&)
noexcept -> static_vector_non_trivial_storage& =
default;
268 ~static_vector_non_trivial_storage()
noexcept(is_nothrow_destructible_v<T>)
270 unsafe_destroy_all();
274 [[nodiscard]]
auto data()
const noexcept -> const_pointer
276 return reinterpret_cast<const_pointer>(_data);
280 [[nodiscard]]
auto data()
noexcept -> pointer
282 return reinterpret_cast<pointer>(_data);
286 [[nodiscard]]
auto end()
const noexcept -> const_pointer
288 return data() + size();
292 [[nodiscard]]
auto end()
noexcept -> pointer
294 return data() + size();
298 [[nodiscard]]
auto size()
const noexcept -> size_type
305 [[nodiscard]]
auto capacity()
const noexcept -> size_type
311 [[nodiscard]]
auto empty()
const noexcept ->
bool
313 return size() == size_type{0};
317 [[nodiscard]]
auto full()
const noexcept ->
bool
319 return size() == Capacity;
324 template <
typename... Args>
325 auto emplace_back(Args&&... args)
noexcept(
noexcept(
new (end()) T(etl::forward<Args>(args)...))) ->
void
327 TETL_PRECONDITION(!full());
328 new (end()) T(
etl::forward<Args>(args)...);
329 unsafe_set_size(
static_cast<size_type>(size() + 1));
333 auto pop_back()
noexcept(is_nothrow_destructible_v<T>) ->
void
335 TETL_PRECONDITION(!empty());
336 auto* ptr = end() - 1;
338 unsafe_set_size(
static_cast<size_type>(size() - 1));
345 auto unsafe_set_size(size_t newSize)
noexcept ->
void
347 TETL_PRECONDITION(newSize <= Capacity);
348 _size = size_type(newSize);
354 template <
typename InputIt>
355 auto unsafe_destroy(InputIt first, InputIt last)
noexcept(is_nothrow_destructible_v<T>) ->
void
357 TETL_PRECONDITION(first >= data()
and first <= end());
358 TETL_PRECONDITION(last >= data()
and last <= end());
359 for (; first != last; ++first) {
367 auto unsafe_destroy_all()
noexcept(is_nothrow_destructible_v<T>) ->
void
369 unsafe_destroy(data(), end());
373 using raw_type = remove_const_t<T>;
374 using aligned = aligned_storage_t<
sizeof(raw_type),
alignof(raw_type)>;
375 using storage_type = conditional_t<!is_const_v<T>, aligned, aligned
const>;
377 alignas(
alignof(T)) storage_type _data[Capacity];
382template <
typename T, size_t Capacity>
383using static_vector_storage_type = conditional_t<
385 static_vector_zero_storage<T>,
388 static_vector_trivial_storage<T, Capacity>,
389 static_vector_non_trivial_storage<T, Capacity>
400template <
typename T, size_t Capacity>
403 static_assert(is_nothrow_destructible_v<T>);
404 using base_type = detail::static_vector_storage_type<T, Capacity>;
407 using base_type::unsafe_destroy;
408 using base_type::unsafe_destroy_all;
409 using base_type::unsafe_set_size;
413 using value_type =
typename base_type::value_type;
415 using difference_type = ptrdiff_t;
417 using reference = value_type&;
419 using const_reference = value_type
const&;
421 using pointer =
typename base_type::pointer;
423 using const_pointer =
typename base_type::const_pointer;
425 using iterator =
typename base_type::pointer;
427 using const_iterator =
typename base_type::const_pointer;
429 using size_type = size_t;
431 using reverse_iterator =
etl::reverse_iterator<iterator>;
433 using const_reverse_iterator =
etl::reverse_iterator<const_iterator>;
436 constexpr auto emplace_n(size_type n)
noexcept(
437 (is_move_constructible_v<T>
and is_nothrow_move_constructible_v<T>)
438 || (is_copy_constructible_v<T>
and is_nothrow_copy_constructible_v<T>)
441 TETL_PRECONDITION(n <= capacity());
470 return reverse_iterator(end());
475 return const_reverse_iterator(end());
480 return reverse_iterator(begin());
483 [[
nodiscard]]
constexpr auto rend()
const noexcept -> const_reverse_iterator
485 return const_reverse_iterator(begin());
510 return const_reverse_iterator(end());
515 return const_reverse_iterator(begin());
518 using base_type::emplace_back;
520 using base_type::pop_back;
523 template <
typename U>
524 requires(is_constructible_v<T, U>
and is_assignable_v<reference, U &&>)
527 TETL_PRECONDITION(!full());
528 emplace_back(
etl::forward<U>(value));
531 template <
typename InIt>
532 requires(detail::InputIterator<InIt>)
537 assert_iterator_in_range(position);
538 assert_valid_iterator_pair(first, last);
539 if constexpr (detail::RandomAccessIterator<InIt>) {
540 TETL_PRECONDITION(size() +
static_cast<size_type>(last - first) <= capacity());
545 for (; first != last; ++first) {
546 emplace_back(
etl::move(*first));
548 auto* writablePosition = begin() + (position - begin());
549 rotate<iterator>(writablePosition, b, end());
550 return writablePosition;
553 template <
typename... Args>
554 requires(is_constructible_v<T, Args...>)
555 constexpr auto emplace(const_iterator position, Args&&... args)
noexcept(
559 TETL_PRECONDITION(!full());
560 assert_iterator_in_range(position);
561 value_type a(
etl::forward<Args>(args)...);
562 return move_insert(position, &a, &a + 1);
566 using base_type::data;
570 requires(is_move_constructible_v<T>)
572 TETL_PRECONDITION(!full());
573 assert_iterator_in_range(position);
574 return move_insert(position, &x, &x + 1);
577 constexpr auto insert(const_iterator position, size_type n, T
const& x)
noexcept(
noexcept(
push_back(
x))) -> iterator
578 requires(is_copy_constructible_v<T>)
580 assert_iterator_in_range(position);
581 TETL_PRECONDITION(size() + n <= capacity());
588 auto* writablePosition = begin() + (position - begin());
589 rotate(writablePosition, b, end());
590 return writablePosition;
595 requires(is_copy_constructible_v<T>)
597 TETL_PRECONDITION(!full());
598 assert_iterator_in_range(position);
599 return insert(position, size_type(1), x);
602 template <
typename InputIt>
606 detail::InputIterator<InputIt> && is_constructible_v<value_type, detail::iterator_reference_t<InputIt>>
609 assert_iterator_in_range(position);
610 assert_valid_iterator_pair(first, last);
611 if constexpr (detail::RandomAccessIterator<InputIt>) {
612 TETL_PRECONDITION(size() +
static_cast<size_type>(last - first) <= capacity());
617 for (; first != last; ++first) {
618 emplace_back(*first);
621 auto* writablePosition = begin() + (position - begin());
622 rotate(writablePosition, b, end());
623 return writablePosition;
629 unsafe_destroy_all();
640 template <
etl::size_t Size>
641 requires(Size <= Capacity)
644 move_insert(begin(),
etl::begin(source),
etl::end(source));
652 insert(begin(), other.begin(), other.end());
660 move_insert(begin(), other.begin(), other.end());
667 requires(is_assignable_v<reference, const_reference>)
672 insert(begin(), other.begin(), other.end());
680 requires(is_assignable_v<reference, reference>)
685 move_insert(begin(), other.begin(), other.end());
690 explicit constexpr static_vector(size_type n)
noexcept(
noexcept(emplace_n(n)))
691 requires(is_copy_constructible_v<T> || is_move_constructible_v<T>)
693 TETL_PRECONDITION(n <= capacity());
698 constexpr static_vector(size_type n, T
const& value)
noexcept(
noexcept(insert(begin(), n, value)))
699 requires(is_copy_constructible_v<T>)
701 TETL_PRECONDITION(n <= capacity());
702 insert(begin(), n, value);
706 template <
typename InputIter>
707 requires(detail::InputIterator<InputIter>)
710 if constexpr (detail::RandomAccessIterator<InputIter>) {
711 TETL_PRECONDITION(last - first >= 0);
712 TETL_PRECONDITION(
static_cast<size_type>(last - first) <= capacity());
714 insert(begin(), first, last);
718 using base_type::empty;
720 using base_type::full;
725 return base_type::size();
731 return base_type::capacity();
740 template <
typename InputIter>
741 requires(detail::InputIterator<InputIter>)
746 if constexpr (detail::RandomAccessIterator<InputIter>) {
747 TETL_PRECONDITION(last - first >= 0);
748 TETL_PRECONDITION(
static_cast<size_type>(last - first) <= capacity());
751 insert(begin(), first, last);
754 constexpr auto assign(size_type n, T
const& u) ->
void
755 requires(is_copy_constructible_v<T>)
757 TETL_PRECONDITION(n <= capacity());
759 insert(begin(), n, u);
765 return detail::index(*
this, pos);
771 return detail::index(*
this, pos);
777 return detail::index(*
this, 0);
782 return detail::index(*
this, 0);
788 TETL_PRECONDITION(!empty());
789 return detail::index(*
this,
static_cast<size_type>(
size() - 1));
794 TETL_PRECONDITION(!empty());
795 return detail::index(*
this,
static_cast<size_type>(
size() - 1));
799 constexpr auto erase(const_iterator position)
noexcept -> iterator
800 requires(detail::is_movable_v<value_type>)
802 assert_iterator_in_range(position);
803 return erase(position, position + 1);
806 constexpr auto erase(const_iterator first, const_iterator last)
noexcept -> iterator
807 requires(detail::is_movable_v<value_type>)
809 assert_iterator_pair_in_range(first, last);
810 iterator p = begin() + (first - begin());
812 unsafe_destroy(
etl::move(p + (last - first), end(), p), end());
813 unsafe_set_size(
size() -
static_cast<size_type>(last - first));
821 requires(is_assignable_v<T&, T &&>)
824 other =
etl::move(*
this);
825 (*
this) =
etl::move(tmp);
830 constexpr auto resize(size_type sz)
noexcept(
831 (is_move_constructible_v<T> && is_nothrow_move_constructible_v<T>)
832 || (is_copy_constructible_v<T> && is_nothrow_copy_constructible_v<T>)
834 requires(detail::is_movable_v<value_type>)
845 erase(end() - (
size() - sz), end());
848 constexpr auto resize(size_type sz, T
const& value)
noexcept(is_nothrow_copy_constructible_v<T>) ->
void
849 requires(is_copy_constructible_v<T>)
855 TETL_PRECONDITION(sz <= capacity());
856 insert(end(), sz -
size(), value);
858 erase(end() - (
size() - sz), end());
863 template <
typename It>
864 constexpr void assert_iterator_in_range([[maybe_unused]] It it)
noexcept
866 static_assert(is_pointer_v<It>);
867 TETL_PRECONDITION(begin() <= it);
868 TETL_PRECONDITION(it <= end());
871 template <
typename It0,
typename It1>
872 constexpr void assert_valid_iterator_pair([[maybe_unused]] It0 first, [[maybe_unused]] It1 last)
noexcept
874 static_assert(is_pointer_v<It0>);
875 static_assert(is_pointer_v<It1>);
876 TETL_PRECONDITION(first <= last);
879 template <
typename It0,
typename It1>
880 constexpr void assert_iterator_pair_in_range([[maybe_unused]] It0 first, [[maybe_unused]] It1 last)
noexcept
882 assert_iterator_in_range(first);
883 assert_iterator_in_range(last);
884 assert_valid_iterator_pair(first, last);
890template <
typename T, size_t Capacity>
901template <
typename T, size_t Capacity>
904 if (size(lhs) == size(rhs)) {
905 return equal(begin(lhs), end(lhs), begin(rhs), end(rhs),
equal_to{});
911template <
typename T, size_t Capacity>
914 return !(lhs == rhs);
922template <
typename T, size_t Capacity>
925 return lexicographical_compare(begin(lhs), end(lhs), begin(rhs), end(rhs));
928template <
typename T, size_t Capacity>
934template <
typename T, size_t Capacity>
940template <
typename T, size_t Capacity>
951template <
typename T, size_t Capacity,
typename Predicate>
954 auto* it = remove_if(c.begin(), c.end(), pred);
955 auto r = distance(it, c.end());
956 c.erase(it, c.end());
957 return static_cast<
typename static_vector<T, Capacity>::size_type>(r);
960template <
typename T, size_t Capacity,
typename U>
963 return erase_if(c, [&value](
auto const& item) {
return item == value; });
Definition adjacent_find.hpp:9
constexpr auto swap(static_vector< T, Capacity > &lhs, static_vector< T, Capacity > &rhs) noexcept -> void
Specializes the swap algorithm for static_vector. Swaps the contents of lhs and rhs.
Definition static_vector.hpp:891
constexpr auto operator==(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Compares the contents of two vectors.
Definition static_vector.hpp:902
constexpr auto operator!=(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Definition static_vector.hpp:912
constexpr auto operator>=(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Definition static_vector.hpp:941
constexpr auto operator<=(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Definition static_vector.hpp:929
constexpr auto erase_if(static_vector< T, Capacity > &c, Predicate pred) -> typename static_vector< T, Capacity >::size_type
Erases all elements that satisfy the predicate pred from the container.
Definition static_vector.hpp:952
constexpr auto erase(static_vector< T, Capacity > &c, U const &value) -> typename static_vector< T, Capacity >::size_type
Definition static_vector.hpp:961
constexpr auto operator<(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Compares the contents of two vectors.
Definition static_vector.hpp:923
constexpr auto operator>(static_vector< T, Capacity > const &lhs, static_vector< T, Capacity > const &rhs) noexcept -> bool
Definition static_vector.hpp:935
A container that encapsulates fixed size arrays.
Definition array.hpp:49
Definition c_array.hpp:16
Function object for performing comparisons. Unless specialised, invokes operator== on type T....
Definition equal_to.hpp:15
Dynamically-resizable fixed-capacity vector.
Definition static_vector.hpp:401
constexpr auto assign(InputIter first, InputIter last) noexcept(noexcept(clear()) and noexcept(insert(begin(), first, last))) -> void
assign
Definition static_vector.hpp:743
constexpr auto insert(const_iterator position, const_reference x) noexcept(noexcept(insert(position, size_type(1), x))) -> iterator requires(is_copy_constructible_v< T >)
Definition static_vector.hpp:594
constexpr auto operator[](size_type pos) const noexcept -> const_reference
Unchecked access to element at index pos (UB if index not in.
Definition static_vector.hpp:769
constexpr static_vector(InputIter first, InputIter last)
Initialize vector from range [first, last).
Definition static_vector.hpp:708
constexpr auto emplace(const_iterator position, Args &&... args) noexcept(noexcept(move_insert(position, declval< value_type * >(), declval< value_type * >()))) -> iterator
Definition static_vector.hpp:555
constexpr auto front() const noexcept -> const_reference
Definition static_vector.hpp:780
constexpr auto operator=(static_vector const &other) noexcept(noexcept(clear()) &&noexcept(insert(begin(), other.begin(), other.end()))) -> static_vector &requires(is_assignable_v< reference, const_reference >)
Copy assignment.
Definition static_vector.hpp:664
constexpr static_vector()=default
constexpr auto operator=(static_vector &&other) noexcept(noexcept(clear()) and noexcept(move_insert(begin(), other.begin(), other.end()))) -> static_vector &requires(is_assignable_v< reference, reference >)
Move assignment.
Definition static_vector.hpp:677
constexpr static_vector(static_vector &&other) noexcept(noexcept(move_insert(begin(), other.begin(), other.end())))
Move constructor.
Definition static_vector.hpp:656
constexpr auto crbegin() const noexcept -> const_reverse_iterator
Definition static_vector.hpp:508
constexpr auto move_insert(const_iterator position, InIt first, InIt last) noexcept(noexcept(emplace_back(etl::move(*first)))) -> iterator
Definition static_vector.hpp:534
constexpr auto insert(const_iterator position, size_type n, T const &x) noexcept(noexcept(push_back(x))) -> iterator requires(is_copy_constructible_v< T >)
Definition static_vector.hpp:577
constexpr auto rbegin() const noexcept -> const_reverse_iterator
Definition static_vector.hpp:473
constexpr auto swap(static_vector &other) noexcept(is_nothrow_swappable_v< T >) -> void requires(is_assignable_v< T &, T && >)
Exchanges the contents of the container with those of other.
Definition static_vector.hpp:820
constexpr auto cend() noexcept -> const_iterator
Definition static_vector.hpp:498
constexpr auto back() noexcept -> reference
back
Definition static_vector.hpp:786
constexpr auto insert(const_iterator position, InputIt first, InputIt last) noexcept(noexcept(emplace_back(*first))) -> iterator requires(detail::InputIterator< InputIt > &&is_constructible_v< value_type, detail::iterator_reference_t< InputIt > >)
Definition static_vector.hpp:603
constexpr auto push_back(U &&value) noexcept(noexcept(emplace_back(etl::forward< U >(value)))) -> void
Appends value at the end of the vector.
Definition static_vector.hpp:525
constexpr auto rend() noexcept -> reverse_iterator
Definition static_vector.hpp:478
constexpr auto begin() noexcept -> iterator
Definition static_vector.hpp:448
constexpr static_vector(Source) noexcept
Definition static_vector.hpp:636
constexpr auto end() noexcept -> iterator
Definition static_vector.hpp:458
constexpr auto begin() const noexcept -> const_iterator
Definition static_vector.hpp:453
constexpr auto cbegin() const noexcept -> const_iterator
Definition static_vector.hpp:493
constexpr auto resize(size_type sz, T const &value) noexcept(is_nothrow_copy_constructible_v< T >) -> void requires(is_copy_constructible_v< T >)
Definition static_vector.hpp:848
constexpr auto assign(size_type n, T const &u) -> void requires(is_copy_constructible_v< T >)
Definition static_vector.hpp:754
constexpr auto erase(const_iterator first, const_iterator last) noexcept -> iterator requires(detail::is_movable_v< value_type >)
Definition static_vector.hpp:806
constexpr auto operator[](size_type pos) noexcept -> reference
Unchecked access to element at index pos (UB if index not in.
Definition static_vector.hpp:763
constexpr void clear() noexcept
Clears the vector.
Definition static_vector.hpp:627
constexpr auto back() const noexcept -> const_reference
Definition static_vector.hpp:792
constexpr auto front() noexcept -> reference
front
Definition static_vector.hpp:775
constexpr auto erase(const_iterator position) noexcept -> iterator requires(detail::is_movable_v< value_type >)
erase
Definition static_vector.hpp:799
constexpr auto max_size() const noexcept -> size_type
Definition static_vector.hpp:734
constexpr static_vector(size_type n, T const &value) noexcept(noexcept(insert(begin(), n, value)))
Initializes vector with n with value.
Definition static_vector.hpp:698
constexpr auto resize(size_type sz) noexcept((is_move_constructible_v< T > &&is_nothrow_move_constructible_v< T >)||(is_copy_constructible_v< T > &&is_nothrow_copy_constructible_v< T >)) -> void requires(detail::is_movable_v< value_type >)
Resizes the container to contain sz elements. If elements need to be appended, these are move-constru...
Definition static_vector.hpp:830
constexpr auto end() const noexcept -> const_iterator
Definition static_vector.hpp:463
constexpr auto crend() const noexcept -> const_reverse_iterator
Definition static_vector.hpp:513
constexpr auto insert(const_iterator position, value_type &&x) noexcept(noexcept(move_insert(position, &x, &x+1))) -> iterator requires(is_move_constructible_v< T >)
Definition static_vector.hpp:568
constexpr static_vector(c_array< T, Size > &&source)
Definition static_vector.hpp:642
constexpr static_vector(static_vector const &other) noexcept(noexcept(insert(begin(), other.begin(), other.end())))
Copy constructor.
Definition static_vector.hpp:648
constexpr auto rend() const noexcept -> const_reverse_iterator
Definition static_vector.hpp:483
constexpr auto size() const noexcept -> size_type
Number of elements in the vector.
Definition static_vector.hpp:723
constexpr auto cend() const noexcept -> const_iterator
Definition static_vector.hpp:503
constexpr auto capacity() const noexcept -> size_type
Maximum number of elements that can be allocated in the vector.
Definition static_vector.hpp:729
constexpr static_vector(size_type n) noexcept(noexcept(emplace_n(n)))
Initializes vector with n default-constructed elements.
Definition static_vector.hpp:690
constexpr auto rbegin() noexcept -> reverse_iterator
Definition static_vector.hpp:468
constexpr auto cbegin() noexcept -> const_iterator
Definition static_vector.hpp:488