25#ifndef LMMS_ARRAY_VECTOR_H
26#define LMMS_ARRAY_VECTOR_H
49template<
typename T, std::
size_t N>
70 std::uninitialized_copy(other.begin(), other.end(),
begin());
76 std::uninitialized_move(other.begin(), other.end(),
begin());
91 std::uninitialized_value_construct_n(
begin(),
count);
94 template<std::input_iterator It>
98 const auto end = std::uninitialized_copy(first, last,
begin());
103 ArrayVector(std::initializer_list<T> il)
noexcept(std::is_nothrow_copy_constructible_v<T>) :
107 std::uninitialized_copy(il.begin(), il.end(),
begin());
113 noexcept(std::is_nothrow_copy_assignable_v<T> && std::is_nothrow_copy_constructible_v<T>)
115 if (
this != &other) {
116 const auto toAssign = std::min(other.size(),
size());
117 const auto assignedFromEnd = other.begin() + toAssign;
118 const auto assignedToEnd = std::copy(other.begin(), other.begin() + toAssign,
begin());
119 std::destroy(assignedToEnd,
end());
120 std::uninitialized_copy(assignedFromEnd, other.end(),
end());
127 noexcept(std::is_nothrow_move_assignable_v<T> && std::is_nothrow_move_constructible_v<T>)
129 if (
this != &other) {
130 const auto toAssign = std::min(other.size(),
size());
131 const auto assignedFromEnd = other.begin() + toAssign;
132 const auto assignedToEnd = std::move(other.begin(), other.begin() + toAssign,
begin());
133 std::destroy(assignedToEnd,
end());
134 std::uninitialized_move(assignedFromEnd, other.end(),
end());
142 noexcept(std::is_nothrow_copy_assignable_v<T> && std::is_nothrow_copy_constructible_v<T>)
145 const auto toAssign = std::min(il.size(),
size());
146 const auto assignedFromEnd = il.begin() + toAssign;
147 const auto assignedToEnd = std::copy(il.begin(), assignedFromEnd,
begin());
148 std::destroy(assignedToEnd,
end());
149 std::uninitialized_copy(assignedFromEnd, il.end(),
end());
155 noexcept(std::is_nothrow_copy_assignable_v<T> && std::is_nothrow_copy_constructible_v<T>)
158 const auto temp =
value;
159 const auto toAssign = std::min(
count,
size());
160 const auto toConstruct =
count - toAssign;
161 const auto assignedToEnd = std::fill_n(
begin(), toAssign, temp);
162 std::destroy(assignedToEnd,
end());
163 std::uninitialized_fill_n(assignedToEnd, toConstruct, temp);
167 template<std::input_iterator It>
172 for (; first != last && pos !=
end(); ++pos, ++first) {
175 std::destroy(pos,
end());
176 pos = std::uninitialized_copy(first, last, pos);
183 if (index >=
m_size) {
throw std::out_of_range{
"index out of range"}; }
184 return data()[index];
189 if (index >=
m_size) {
throw std::out_of_range{
"index out of range"}; }
190 return data()[index];
196 return data()[index];
202 return data()[index];
250 const auto newEnd = std::uninitialized_fill_n(
end(),
count,
value);
251 std::rotate(mutPos,
end(), newEnd);
256 template<std::input_iterator It>
262 const auto newEnd = std::uninitialized_copy(first, last,
end());
263 std::rotate(mutPos,
end(), newEnd);
271 template<
typename... Args>
277 std::rotate(mutPos,
end() - 1,
end());
285 const auto mutFirst =
begin() + (first -
cbegin());
287 const auto newEnd = std::move(mutLast,
end(), mutFirst);
288 std::destroy(newEnd,
end());
296 template<
typename... Args>
300 const auto result = std::construct_at(
end(), std::forward<Args>(args)...);
309 std::destroy_at(
end());
314 if (
size >
N) {
throw std::length_error{
"size exceeds maximum size"}; }
318 std::uninitialized_value_construct(
end(),
begin() +
size);
325 if (
size >
N) {
throw std::length_error{
"size exceeds maximum size"}; }
335 noexcept(std::is_nothrow_swappable_v<T> && std::is_nothrow_move_constructible_v<T>)
342 noexcept(std::is_nothrow_swappable_v<T> && std::is_nothrow_move_constructible_v<T>)
344 const auto toSwap = std::min(
a.size(),
b.size());
345 const auto aSwapEnd =
a.begin() + toSwap;
346 const auto bSwapEnd =
b.begin() + toSwap;
347 std::swap_ranges(
a.begin(), aSwapEnd,
b.begin());
348 std::uninitialized_move(aSwapEnd,
a.end(), bSwapEnd);
349 std::uninitialized_move(bSwapEnd,
b.end(), aSwapEnd);
350 std::destroy(aSwapEnd,
a.end());
351 std::destroy(bSwapEnd,
b.end());
352 std::swap(
a.m_size,
b.m_size);
357 return std::lexicographical_compare_three_way(
l.begin(),
l.end(),
r.begin(),
r.end());
362 return std::equal(
l.begin(),
l.end(),
r.begin(),
r.end());
366 alignas(T) std::byte
m_data[std::max(
N *
sizeof(T), std::size_t{1})];
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
reference operator[](size_type index) noexcept
Definition ArrayVector.h:193
const T & const_reference
Definition ArrayVector.h:57
const T * const_pointer
Definition ArrayVector.h:59
ArrayVector(It first, It last)
Definition ArrayVector.h:95
reference emplace_back(Args &&... args)
Definition ArrayVector.h:297
friend bool operator==(const ArrayVector &l, const ArrayVector &r)
Definition ArrayVector.h:360
const_pointer const_iterator
Definition ArrayVector.h:61
ArrayVector & operator=(ArrayVector &&other) noexcept(std::is_nothrow_move_assignable_v< T > &&std::is_nothrow_move_constructible_v< T >)
Definition ArrayVector.h:126
const_iterator cbegin() const noexcept
Definition ArrayVector.h:216
void push_back(T &&value)
Definition ArrayVector.h:294
size_type max_size() const noexcept
Definition ArrayVector.h:233
reference front() noexcept
Definition ArrayVector.h:205
std::size_t size_type
Definition ArrayVector.h:53
bool empty() const noexcept
Definition ArrayVector.h:230
reverse_iterator rbegin() noexcept
Definition ArrayVector.h:222
iterator insert(const_iterator pos, It first, It last)
Definition ArrayVector.h:257
const_reference back() const noexcept
Definition ArrayVector.h:209
ArrayVector(const ArrayVector &other) noexcept(std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:67
iterator erase(const_iterator pos)
Definition ArrayVector.h:281
~ArrayVector()
Definition ArrayVector.h:110
const_reverse_iterator rend() const noexcept
Definition ArrayVector.h:227
T value_type
Definition ArrayVector.h:55
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition ArrayVector.h:63
iterator emplace(const_iterator pos, Args &&... args)
Definition ArrayVector.h:272
const_reverse_iterator crbegin() const noexcept
Definition ArrayVector.h:224
std::reverse_iterator< iterator > reverse_iterator
Definition ArrayVector.h:62
const_iterator cend() const noexcept
Definition ArrayVector.h:220
iterator erase(const_iterator first, const_iterator last)
Definition ArrayVector.h:282
void swap(ArrayVector &other) noexcept(std::is_nothrow_swappable_v< T > &&std::is_nothrow_move_constructible_v< T >)
Definition ArrayVector.h:334
void resize(size_type size, const value_type &value)
Definition ArrayVector.h:323
void clear() noexcept
Definition ArrayVector.h:236
void push_back(const T &value)
Definition ArrayVector.h:293
ArrayVector(size_type count) noexcept(std::is_nothrow_default_constructible_v< T >)
Definition ArrayVector.h:87
reverse_iterator rend() noexcept
Definition ArrayVector.h:226
const_reference at(size_type index) const
Definition ArrayVector.h:187
std::byte m_data[std::max(N *sizeof(T), std::size_t{1})]
Definition ArrayVector.h:366
iterator insert(const_iterator pos, std::initializer_list< T > il)
Definition ArrayVector.h:269
size_type capacity() const noexcept
Definition ArrayVector.h:234
iterator insert(const_iterator pos, size_type count, const T &value)
Definition ArrayVector.h:245
size_type size() const noexcept
Definition ArrayVector.h:232
const_reference operator[](size_type index) const noexcept
Definition ArrayVector.h:199
ArrayVector(std::initializer_list< T > il) noexcept(std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:103
void assign(size_type count, const T &value) noexcept(std::is_nothrow_copy_assignable_v< T > &&std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:154
iterator begin() noexcept
Definition ArrayVector.h:214
const_iterator begin() const noexcept
Definition ArrayVector.h:215
reference at(size_type index)
Definition ArrayVector.h:181
pointer data() noexcept
Definition ArrayVector.h:211
T & reference
Definition ArrayVector.h:56
pointer iterator
Definition ArrayVector.h:60
const_iterator end() const noexcept
Definition ArrayVector.h:219
bool full() const noexcept
Definition ArrayVector.h:231
ArrayVector & operator=(std::initializer_list< T > il) noexcept(std::is_nothrow_copy_assignable_v< T > &&std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:141
size_type m_size
Definition ArrayVector.h:367
iterator insert(const_iterator pos, T &&value)
Definition ArrayVector.h:243
const_reverse_iterator crend() const noexcept
Definition ArrayVector.h:228
ArrayVector(ArrayVector &&other) noexcept(std::is_nothrow_move_constructible_v< T >)
Definition ArrayVector.h:73
void assign(It first, It last)
Definition ArrayVector.h:168
const_pointer data() const noexcept
Definition ArrayVector.h:212
void pop_back()
Definition ArrayVector.h:305
ArrayVector(size_type count, const T &value) noexcept(std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:80
T * pointer
Definition ArrayVector.h:58
reference back() noexcept
Definition ArrayVector.h:208
friend void swap(ArrayVector &a, ArrayVector &b) noexcept(std::is_nothrow_swappable_v< T > &&std::is_nothrow_move_constructible_v< T >)
Definition ArrayVector.h:341
friend constexpr auto operator<=>(const ArrayVector &l, const ArrayVector &r)
Definition ArrayVector.h:355
std::ptrdiff_t difference_type
Definition ArrayVector.h:54
const_reverse_iterator rbegin() const noexcept
Definition ArrayVector.h:223
ArrayVector & operator=(const ArrayVector &other) noexcept(std::is_nothrow_copy_assignable_v< T > &&std::is_nothrow_copy_constructible_v< T >)
Definition ArrayVector.h:112
iterator insert(const_iterator pos, const T &value)
Definition ArrayVector.h:242
const_reference front() const noexcept
Definition ArrayVector.h:206
iterator end() noexcept
Definition ArrayVector.h:218
void resize(size_type size)
Definition ArrayVector.h:312
int * l
Definition inflate.c:1579
static PuglViewHint int value
Definition pugl.h:1708
Definition AudioAlsa.cpp:35
#define N
Definition nseel-cfunc.c:36
int r
Definition crypt.c:458
int result
Definition process.c:1455
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263
#define const
Definition zconf.h:137