15#include <QHashFunctions>
21template<
typename T,
size_t N>
31inline constexpr bool is_fixed_list_v =
false;
33template<
typename T,
size_t N>
34inline constexpr bool is_fixed_list_v<Qx::FixedList<T, N>> =
true;
42template<
typename T,
size_t N>
47 static constexpr qsizetype
size_v =
static_cast<qsizetype
>(N);
49 static_assert(N <= static_cast<size_t>(std::numeric_limits<qsizetype>::max()),
"FixedList is too large!");
62 using iterator =
typename std::array<T, N>::iterator;
73 std::array<T, N> mArr{};
76 template<
typename U,
size_t M>
89 constexpr FixedList(
const T (&arr)[M]) : mArr(std::to_array(arr)) {}
96 requires std::same_as<std::remove_cvref_t<A>, std::array<T, N>>
97 constexpr FixedList(A&& arr) : mArr(std::forward<A>(arr)) {}
100 template<
typename... Args>
101 requires (N > 0 &&
sizeof...(Args) == N && (std::convertible_to<Args, T> && ...))
102 constexpr FixedList(Args&&... args) : mArr{ static_cast<T>(std::forward<Args>(args))... } {}
106 template<
size_t Pos,
size_t K>
109 return [
this]<
size_t... I>(std::index_sequence<I...>) {
111 }(std::make_index_sequence<K>{});
116 static constexpr qsizetype
size() noexcept {
return size_v; }
119 static constexpr bool isEmpty() noexcept {
return N == 0; }
120 static constexpr bool empty() noexcept {
return N == 0; }
127 constexpr std::array<T, N>&
stdArray() noexcept {
return mArr; }
128 constexpr const std::array<T, N>&
stdArray() const noexcept {
return mArr; }
129 constexpr std::array<T, N>
toStdArray()
const {
return mArr; }
135 Q_ASSERT_X(
size_t(i) < N,
"FixedList::operator[]",
"index out of range");
136 return mArr[size_t(i)];
141 Q_ASSERT_X(
size_t(i) < N,
"FixedList::operator[]",
"index out of range");
142 return mArr[size_t(i)];
147 Q_ASSERT_X(
size_t(i) < N,
"FixedList::at",
"index out of range");
148 return mArr[size_t(i)];
153 Q_ASSERT_X(
size_t(i) < N,
"FixedList::at",
"index out of range");
154 return mArr[size_t(i)];
157 constexpr T
value(qsizetype i)
const requires std::default_initializable<T>
159 return size_t(i) < N ? mArr[size_t(i)] : T();
162 template<
typename AT = T>
163 constexpr T
value(qsizetype i,
const AT& defaultValue)
const
165 return size_t(i) < N ? mArr[size_t(i)] :
static_cast<T
>(defaultValue);
186 template<
size_t I>
constexpr T&
get() &
noexcept {
static_assert(I < N);
return mArr[I]; }
189 template<
size_t I>
constexpr const T&
get() const& noexcept {
static_assert(I < N);
return mArr[I]; }
192 template<
size_t I>
constexpr T&&
get() &&
noexcept {
static_assert(I < N);
return std::move(mArr[I]); }
214 template<
typename AT = T>
220 template<
typename AT = T>
221 constexpr qsizetype
count(
const AT& t)
const
223 return static_cast<qsizetype
>(std::count(
begin(),
end(), t));
226 template<
typename AT = T>
227 constexpr qsizetype
indexOf(
const AT& t, qsizetype from = 0)
const
230 from = std::max(from +
size_v, qsizetype(0));
237 return static_cast<qsizetype
>(it - b);
243 template<
typename AT = T>
244 constexpr qsizetype
lastIndexOf(
const AT& t, qsizetype from = -1)
const
258 return static_cast<qsizetype
>(it - b);
268 template<
typename AT = T>
271 template<
typename AT = T>
275 template<
typename AT = T>
282 template<
typename AT = T>
283 constexpr void replace(qsizetype i,
const AT& t)
285 Q_ASSERT_X(
size_t(i) < N,
"FixedList::replace",
"index out of range");
291 Q_ASSERT_X(
size_t(i) < N &&
size_t(j) < N,
"FixedList::swapItemsAt",
"index out of range");
292 std::swap(mArr[
size_t(i)], mArr[
size_t(j)]);
295 constexpr void move(qsizetype from, qsizetype to)
297 Q_ASSERT_X(
size_t(from) < N &&
size_t(to) < N,
"FixedList::move",
"index out of range");
303 std::rotate(b + from, b + from + 1, b + to + 1);
305 std::rotate(b + to, b + from, b + from + 1);
308 constexpr void swap(
FixedList& other)
noexcept(std::is_nothrow_swappable_v<T>) { mArr.swap(other.mArr); }
318 template<qsizetype K>
321 static_assert(K >= 0 && size_t(K) <= N,
"FixedList::first<K>(): K out of range");
322 return slice<0, size_t(K)>();
332 template<qsizetype K>
335 static_assert(K >= 0 && size_t(K) <= N,
"FixedList::last<K>(): K out of range");
336 return slice<N - size_t(K), size_t(K)>();
347 template<qsizetype Pos, qsizetype K>
350 static_assert(Pos >= 0 && K >= 0 && size_t(Pos) + size_t(K) <= N,
"FixedList::sliced<Pos, K>(): range out of bounds");
351 return slice<size_t(Pos), size_t(K)>();
362 template<qsizetype Pos>
365 static_assert(Pos >= 0 && size_t(Pos) <= N,
"FixedList::sliced<Pos>(): Pos out of range");
366 return slice<size_t(Pos), N - size_t(Pos)>();
369 template<qsizetype K>
372 static_assert(K >= 0 && size_t(K) <= N,
"FixedList::chopped<K>(): K out of range");
373 return slice<0, N - size_t(K)>();
377 template<qsizetype Pos, qsizetype Len = -1>
378 constexpr auto mid()
const
380 static_assert(Pos >= 0 && size_t(Pos) <= N,
"FixedList::mid<Pos, Len>(): Pos out of range");
381 constexpr size_t avail = N - size_t(Pos);
382 constexpr size_t len = (Len < 0 || size_t(Len) > avail) ? avail : size_t(Len);
383 return slice<size_t(Pos), len>();
390 return [&]<
size_t... I,
size_t... J>(std::index_sequence<I...>, std::index_sequence<J...>) {
392 }(std::make_index_sequence<N>{}, std::make_index_sequence<M>{});
420template<
typename T,
size_t N>
421FixedList(
const T (&)[N]) -> FixedList<T, N>;
424template<
typename T,
typename... U>
425 requires ((std::same_as<T, U> && ...) && (
sizeof...(U) > 0 || !_QxPrivate::is_fixed_list_v<T>))
426FixedList(T, U...) -> FixedList<T, 1 +
sizeof...(U)>;
429template<
typename T,
size_t N>
430FixedList(
const std::array<T, N>&) -> FixedList<T, N>;
439template<
typename T,
size_t M,
size_t N>
450template<
typename T,
size_t N>
463template<
typename T,
size_t N>
476template<
typename T,
size_t N>
477struct tuple_size<
Qx::FixedList<T, N>> : std::integral_constant<size_t, N> {};
479template<
size_t I,
typename T,
size_t N>
480struct tuple_element<I, Qx::FixedList<T, N>>
482 static_assert(I < N);
The FixedList template class is a compile-time friendly fixed size container that wraps std::array,...
Definition qx-fixedlist.h:44
constexpr reverse_iterator rend() noexcept
Definition qx-fixedlist.h:209
T value_type
Definition qx-fixedlist.h:53
T * pointer
Definition qx-fixedlist.h:54
constexpr FixedList< T, N+1 > operator+(const T &other) const
Definition qx-fixedlist.h:401
constexpr bool endsWith(const AT &t) const
Definition qx-fixedlist.h:272
constexpr const_reverse_iterator rend() const noexcept
Definition qx-fixedlist.h:210
T & reference
Definition qx-fixedlist.h:56
constexpr auto first() const
Definition qx-fixedlist.h:319
const_iterator ConstIterator
Definition qx-fixedlist.h:69
constexpr auto mid() const
Definition qx-fixedlist.h:378
constexpr FixedList()=default
constexpr bool operator==(const FixedList &other) const =default
const T * const_pointer
Definition qx-fixedlist.h:55
constexpr reference first()
Definition qx-fixedlist.h:168
friend size_t qHash(const FixedList &key, size_t seed=0)
Definition qx-fixedlist.h:414
qsizetype difference_type
Definition qx-fixedlist.h:59
QList< T > toList() const
Definition qx-fixedlist.h:130
constexpr FixedList< T, 1+N > operator+(const std::type_identity_t< T > &a, const FixedList< T, N > &b)
Definition qx-fixedlist.h:451
constexpr FixedList< T, N > makeFixedList(const T(&arr)[N])
Definition qx-fixedlist.h:464
constexpr const_reverse_iterator crend() const noexcept
Definition qx-fixedlist.h:211
constexpr auto sliced() const
Definition qx-fixedlist.h:363
const T & parameter_type
Definition qx-fixedlist.h:60
constexpr void swap(FixedList &other) noexcept(std::is_nothrow_swappable_v< T >)
Definition qx-fixedlist.h:308
constexpr auto operator<=>(const FixedList &other) const =default
constexpr const_iterator begin() const noexcept
Definition qx-fixedlist.h:196
constexpr reverse_iterator rbegin() noexcept
Definition qx-fixedlist.h:205
constexpr const_reverse_iterator rbegin() const noexcept
Definition qx-fixedlist.h:206
constexpr const_reference constFirst() const
Definition qx-fixedlist.h:170
constexpr const_iterator cend() const noexcept
Definition qx-fixedlist.h:202
typename std::array< T, N >::reverse_iterator reverse_iterator
Definition qx-fixedlist.h:64
constexpr const_reference first() const
Definition qx-fixedlist.h:169
constexpr auto chopped() const
Definition qx-fixedlist.h:370
constexpr reference last()
Definition qx-fixedlist.h:174
constexpr const_reference constLast() const
Definition qx-fixedlist.h:176
static constexpr bool isEmpty() noexcept
Definition qx-fixedlist.h:119
constexpr T value(qsizetype i, const AT &defaultValue) const
Definition qx-fixedlist.h:163
constexpr const_pointer data() const noexcept
Definition qx-fixedlist.h:124
constexpr bool contains(const AT &t) const
Definition qx-fixedlist.h:215
static constexpr bool empty() noexcept
Definition qx-fixedlist.h:120
constexpr FixedList(const T(&arr)[M])
Definition qx-fixedlist.h:89
constexpr iterator begin() noexcept
Definition qx-fixedlist.h:195
constexpr reference at(qsizetype i)
Definition qx-fixedlist.h:145
constexpr void replace(qsizetype i, const AT &t)
Definition qx-fixedlist.h:283
constexpr const_reference operator[](qsizetype i) const
Definition qx-fixedlist.h:139
constexpr auto last() const
Definition qx-fixedlist.h:333
static constexpr qsizetype count() noexcept
Definition qx-fixedlist.h:117
constexpr const_reference front() const
Definition qx-fixedlist.h:172
constexpr T value(qsizetype i) const
Definition qx-fixedlist.h:157
constexpr pointer data() noexcept
Definition qx-fixedlist.h:123
constexpr const_pointer constData() const noexcept
Definition qx-fixedlist.h:125
constexpr bool startsWith(const AT &t) const
Definition qx-fixedlist.h:269
typename std::array< T, N >::const_reverse_iterator const_reverse_iterator
Definition qx-fixedlist.h:65
constexpr const T & get() const &noexcept
Definition qx-fixedlist.h:189
constexpr void move(qsizetype from, qsizetype to)
Definition qx-fixedlist.h:295
constexpr const_reverse_iterator crbegin() const noexcept
Definition qx-fixedlist.h:207
constexpr FixedList< T, N+M > operator+(const FixedList< T, M > &other) const
Definition qx-fixedlist.h:388
constexpr const_iterator constEnd() const noexcept
Definition qx-fixedlist.h:203
constexpr FixedList< T, M+N > operator+(const T(&a)[M], const FixedList< T, N > &b)
Definition qx-fixedlist.h:440
static constexpr qsizetype size() noexcept
Definition qx-fixedlist.h:116
constexpr qsizetype indexOf(const AT &t, qsizetype from=0) const
Definition qx-fixedlist.h:227
constexpr const_reference last() const
Definition qx-fixedlist.h:175
constexpr std::array< T, N > & stdArray() noexcept
Definition qx-fixedlist.h:127
constexpr std::array< T, N > toStdArray() const
Definition qx-fixedlist.h:129
constexpr const std::array< T, N > & stdArray() const noexcept
Definition qx-fixedlist.h:128
constexpr const_iterator end() const noexcept
Definition qx-fixedlist.h:201
constexpr const_reference back() const
Definition qx-fixedlist.h:178
constexpr qsizetype count(const AT &t) const
Definition qx-fixedlist.h:221
constexpr reference operator[](qsizetype i)
Definition qx-fixedlist.h:133
iterator Iterator
Definition qx-fixedlist.h:68
friend constexpr void swap(FixedList &a, FixedList &b) noexcept(noexcept(a.swap(b)))
Definition qx-fixedlist.h:413
qsizetype size_type
Definition qx-fixedlist.h:58
constexpr const_iterator cbegin() const noexcept
Definition qx-fixedlist.h:197
constexpr reference front()
Definition qx-fixedlist.h:171
constexpr const_reference at(qsizetype i) const
Definition qx-fixedlist.h:151
constexpr reference back()
Definition qx-fixedlist.h:177
constexpr FixedList & fill(const AT &t)
Definition qx-fixedlist.h:276
static constexpr qsizetype size_v
Definition qx-fixedlist.h:47
typename std::array< T, N >::iterator iterator
Definition qx-fixedlist.h:62
constexpr auto sliced() const
Definition qx-fixedlist.h:348
constexpr void swapItemsAt(qsizetype i, qsizetype j)
Definition qx-fixedlist.h:289
constexpr FixedList< T, N+M > operator+(const T(&other)[M]) const
Definition qx-fixedlist.h:396
constexpr FixedList(Args &&... args)
Definition qx-fixedlist.h:102
constexpr T && get() &&noexcept
Definition qx-fixedlist.h:192
constexpr FixedList(A &&arr)
Definition qx-fixedlist.h:97
constexpr iterator end() noexcept
Definition qx-fixedlist.h:200
const T & const_reference
Definition qx-fixedlist.h:57
constexpr qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const
Definition qx-fixedlist.h:244
constexpr T & get() &noexcept
Definition qx-fixedlist.h:186
constexpr const_iterator constBegin() const noexcept
Definition qx-fixedlist.h:198
typename std::array< T, N >::const_iterator const_iterator
Definition qx-fixedlist.h:63
static constexpr qsizetype length() noexcept
Definition qx-fixedlist.h:118
The Qx namespace is the main namespace through which all non-global functionality of the Qx library i...
Definition qx-abstracterror.cpp:13