7#include <QtCore/qcompilerdetection.h>
8#include <QtCore/qtypes.h>
9#include <QtCore/qcontainerfwd.h>
14#include <initializer_list>
15#include <QtCore/q20iterator.h>
16#include <QtCore/q20memory.h>
20#include <QtCore/q20type_traits.h>
31#ifdef __cpp_lib_concepts
32namespace std::ranges {
36template <
typename T, std::
size_t E>
37constexpr inline bool enable_borrowed_range<QT_PREPEND_NAMESPACE(
QSpan)<T,
E>> =
true;
38template <
typename T, std::
size_t E>
39constexpr inline bool enable_view<QT_PREPEND_NAMESPACE(
QSpan)<T,
E>> =
true;
47template <
typename T, std::
size_t E>
class QSpanBase;
51template <
typename T, std::
size_t E>
53template <
typename T, std::
size_t E>
56using is_qspan = is_qspan_helper<q20::remove_cvref_t<T>>;
61template <
typename T, std::
size_t E>
65using is_std_span = is_std_span_helper<q20::remove_cvref_t<T>>;
69template <
typename T, std::
size_t N>
74template <
typename From,
typename To>
76 std::is_convertible<From(*)[], To(*)[]>;
77template <
typename From,
typename To>
81#define MAKE_ADL_TEST(what) \
83 template <typename T> using what ## _result = decltype( what (std::declval<T&&>())); \
93template <
typename Range>
94AdlTester::begin_result<Range>
adl_begin(Range &&
r) {
using std::begin;
return begin(
r); }
95template <
typename Range>
96AdlTester::data_result<Range>
adl_data(Range &&
r) {
using std::data;
return data(
r); }
97template <
typename Range>
98AdlTester::size_result<Range>
adl_size(Range &&
r) {
using std::size;
return size(
r); }
102template <
typename Range>
104template <
typename Range>
110 template <
typename Iterator>
114 std::random_access_iterator_tag,
115 typename std::iterator_traits<Iterator>::iterator_category
118 std::remove_reference_t<q20::iter_reference_t<Iterator>>,
122 template <
typename Iterator,
typename End>
125 is_compatible_iterator<Iterator>,
126 std::negation<std::is_convertible<End, std::size_t>>
128 template <
typename Range,
typename =
void>
130 template <
typename Range>
133 template <
typename Range>
136 std::negation<is_qspan<Range>>,
137 std::negation<is_std_span<Range>>,
138 std::negation<is_std_array<Range>>,
139 std::negation<std::is_array<q20::remove_cvref_t<Range>>>,
140 is_compatible_range_helper<Range>
144 template <
typename Iterator>
148 template <
typename Iterator,
typename End>
152 template <
typename Range>
156template <
typename T, std::
size_t E>
159 static_assert(
E <
size_t{(std::numeric_limits<qsizetype>::max)()},
160 "QSpan only supports extents that fit into the signed size type (qsizetype).");
162 struct Enabled_t {
explicit Enabled_t() =
default; };
163 static inline constexpr Enabled_t Enable{};
165 template <
typename S, std::
size_t N>
166 using if_compatible_array = std::enable_if_t<
167 N ==
E && is_qualification_conversion_v<S, T>
170 template <
typename S>
171 using if_qualification_conversion = std::enable_if_t<
172 is_qualification_conversion_v<S, T>
186 template <std::
size_t E2 = E, std::enable_if_t<E2 == 0,
bool> = true>
189 template <
typename It,
typename Base::
template if_compatible_iterator<It> =
true>
196 template <
typename It,
typename End,
typename Base::
template if_compatible_iterator_and_sentinel<It, End> =
true>
200 template <
size_t N, std::enable_if_t<N == E,
bool> = true>
204 template <
typename S,
size_t N, if_compatible_array<S, N> = true>
208 template <
typename S,
size_t N, if_compatible_array<S, N> = true>
212 template <
typename Range,
typename Base::
template if_compatible_range<Range> =
true>
218 template <
typename S, if_qualification_conversion<S> = true>
223 template <
typename S, if_qualification_conversion<S> = true>
228 template <
typename U = T, std::enable_if_t<std::is_const_v<U>,
bool> = true>
234 template <
typename S, if_qualification_conversion<S> = true>
239 template <
typename S, if_qualification_conversion<S> = true>
249 template <
typename S>
250 using if_qualification_conversion = std::enable_if_t<
251 is_qualification_conversion_v<S, T>
264 template <
typename It,
typename Base::
template if_compatible_iterator<It> =
true>
268 template <
typename It,
typename End,
typename Base::
template if_compatible_iterator_and_sentinel<It, End> =
true>
276 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
280 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
284 template <
typename Range,
typename Base::
template if_compatible_range<Range> =
true>
290 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
295 template <
typename U = T, std::enable_if_t<std::is_const_v<U>,
bool> = true>
301 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
310template <
typename T, std::
size_t E>
326 template <std::
size_t N>
331#ifdef QT_COMPILER_HAS_LWG3346
332 using iterator_concept = std::contiguous_iterator_tag;
333 using element_type = T;
351 template <
typename S>
using if_qualification_conversion = bool;
354 template <
typename It, if_compatible_iterator<It> = true>
constexpr QSpan(It
first, It
last);
356 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
constexpr QSpan(std::array<S, N> &arr)
noexcept;
357 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
constexpr QSpan(
const std::array<S, N> &arr)
noexcept;
358 template <
typename Range, if_compatible_range<Range> = true>
constexpr QSpan(Range &&
r);
359 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
constexpr QSpan(QSpan<S, N>
other)
noexcept;
360 template <
typename S,
size_t N, if_qualification_conversion<S> = true>
constexpr QSpan(std::span<S, N>
other)
noexcept;
361 constexpr QSpan(std::initializer_list<value_type> il);
367 [[nodiscard]]
constexpr bool empty() const noexcept {
return size() == 0; }
371 { verify(idx);
return data()[idx]; }
387 template <std::
size_t Count>
388 [[nodiscard]]
constexpr QSpan<T, Count>
first() const
389 noexcept(subspan_always_succeeds_v<Count>)
391 static_assert(Count <=
E,
392 "Count cannot be larger than the span's extent.");
394 return QSpan<T, Count>{
data(), Count};
397 template <std::
size_t Count>
398 [[nodiscard]]
constexpr QSpan<T, Count>
last() const
399 noexcept(subspan_always_succeeds_v<Count>)
401 static_assert(Count <=
E,
402 "Count cannot be larger than the span's extent.");
404 return QSpan<T, Count>{
data() + (
size() - Count), Count};
407 template <std::
size_t Offset>
409 noexcept(subspan_always_succeeds_v<
Offset>)
412 "Offset cannot be larger than the span's extent.");
420 template <std::
size_t Offset, std::
size_t Count>
422 noexcept(subspan_always_succeeds_v<
Offset + Count>)
423 {
return subspan<Offset>().template first<Count>(); }
439template <
class It,
class EndOrSize>
440QSpan(It, EndOrSize) -> QSpan<std::remove_reference_t<q20::iter_reference_t<It>>>;
441template <
class T, std::
size_t N>
443template <
class T, std::
size_t N>
444QSpan(std::array<T, N> &) -> QSpan<T, N>;
445template <
class T, std::
size_t N>
446QSpan(
const std::array<T, N> &) -> QSpan<const T, N>;
448QSpan(
R&&) -> QSpan<std::remove_reference_t<QSpanPrivate::range_reference_t<R>>>;
Q_IMPLICIT constexpr QSpanBase(std::array< S, N > &arr) noexcept
Q_IMPLICIT constexpr QSpanBase(QSpan< S, N > other) noexcept
Q_IMPLICIT constexpr QSpanBase(It first, qsizetype count)
Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t< T >(&arr)[N]) noexcept
Q_IMPLICIT constexpr QSpanBase(It first, End last)
Q_IMPLICIT constexpr QSpanBase(Range &&r)
Q_IMPLICIT constexpr QSpanBase(std::initializer_list< std::remove_cv_t< T > > il) noexcept
Q_IMPLICIT constexpr QSpanBase() noexcept
Q_IMPLICIT constexpr QSpanBase(const std::array< S, N > &arr) noexcept
Q_IMPLICIT constexpr QSpanBase(std::array< S, N > &arr) noexcept
constexpr QSpanBase(It first, qsizetype count)
Q_IMPLICIT constexpr QSpanBase(QSpan< S, E > other) noexcept
Q_IMPLICIT constexpr QSpanBase(Range &&r)
Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t< T >(&arr)[N]) noexcept
Q_IMPLICIT constexpr QSpanBase(std::initializer_list< std::remove_cv_t< T > > il)
Q_IMPLICIT constexpr QSpanBase(const std::array< S, N > &arr) noexcept
Q_IMPLICIT constexpr QSpanBase() noexcept
Q_IMPLICIT constexpr QSpanBase(QSpan< S > other)
static constexpr qsizetype m_size
constexpr QSpanBase(It first, End last)
std::conjunction< is_compatible_iterator< Iterator >, std::negation< std::is_convertible< End, std::size_t > > > is_compatible_iterator_and_sentinel
std::enable_if_t< is_compatible_iterator_and_sentinel< Iterator, End >::value, bool > if_compatible_iterator_and_sentinel
std::enable_if_t< is_compatible_iterator< Iterator >::value, bool > if_compatible_iterator
std::enable_if_t< is_compatible_range< Range >::value, bool > if_compatible_range
std::conjunction< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< Iterator >::iterator_category >, is_qualification_conversion< std::remove_reference_t< q20::iter_reference_t< Iterator > >, T > > is_compatible_iterator
std::conjunction< std::negation< is_qspan< Range > >, std::negation< is_std_span< Range > >, std::negation< is_std_array< Range > >, std::negation< std::is_array< q20::remove_cvref_t< Range > > >, is_compatible_range_helper< Range > > is_compatible_range
constexpr bool empty() const noexcept
constexpr pointer data() const noexcept
static constexpr std::size_t extent
constexpr reverse_iterator rbegin() const noexcept
constexpr reference front() const
constexpr QSpan< T > sliced(size_type pos, size_type n) const
constexpr QSpan< T > sliced(size_type pos) const
constexpr size_type size() const noexcept
const_pointer const_iterator
constexpr iterator end() const noexcept
constexpr const_iterator cbegin() const noexcept
constexpr QSpan< T > subspan(size_type pos, size_type n) const
constexpr const_iterator cend() const noexcept
constexpr reverse_iterator rend() const noexcept
constexpr QSpan< T, Count > last() const noexcept(subspan_always_succeeds_v< Count >)
std::remove_cv_t< T > value_type
constexpr QSpan< T > last(size_type n) const
constexpr const_reverse_iterator crend() const noexcept
constexpr size_type size_bytes() const noexcept
std::reverse_iterator< const_iterator > const_reverse_iterator
constexpr const_reverse_iterator crbegin() const noexcept
constexpr reference operator[](size_type idx) const
constexpr QSpan< T > first(size_type n) const
constexpr reference back() const
constexpr QSpan< T > subspan(size_type pos) const
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset+Count >)
constexpr QSpan< T, Count > first() const noexcept(subspan_always_succeeds_v< Count >)
const T & const_reference
std::reverse_iterator< iterator > reverse_iterator
constexpr iterator begin() const noexcept
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset >)
bool isEmpty() const noexcept
AdlTester::size_result< Range > adl_size(Range &&r)
is_qspan_helper< q20::remove_cvref_t< T > > is_qspan
decltype(QSpanPrivate::adl_begin(std::declval< Range & >())) iterator_t
AdlTester::data_result< Range > adl_data(Range &&r)
is_std_array_helper< q20::remove_cvref_t< T > > is_std_array
std::is_convertible< From(*)[], To(*)[]> is_qualification_conversion
q20::iter_reference_t< QSpanPrivate::iterator_t< Range > > range_reference_t
AdlTester::begin_result< Range > adl_begin(Range &&r)
constexpr bool is_qualification_conversion_v
is_std_span_helper< q20::remove_cvref_t< T > > is_std_span
Combined button and popup list for selecting options.
typename type_identity< T >::type type_identity_t
constexpr auto dynamic_extent
decltype(*std::declval< Dereferencable & >()) iter_reference_t
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLsizei void GLsizei void void * span
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QSpan(It, EndOrSize) -> QSpan< std::remove_reference_t< q20::iter_reference_t< It > > >
#define MAKE_ADL_TEST(what)
#define QT_BEGIN_INCLUDE_NAMESPACE
#define QT_END_INCLUDE_NAMESPACE