8#pragma qt_class(QtAlgorithms)
11#include <QtCore/qglobal.h>
12#include <QtCore/q20functional.h>
25template <
typename ForwardIterator>
26Q_OUTOFLINE_TEMPLATE
void qDeleteAll(ForwardIterator begin, ForwardIterator end)
28 while (begin != end) {
34template <
typename Container>
37 qDeleteAll(c.begin(), c.end());
41
42
43
46#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
48# define QT_HAS_CONSTEXPR_BITOPS
49#elif defined(Q_CC_GNU)
50# define QT_HAS_CONSTEXPR_BITOPS
51# define QT_HAS_BUILTIN_CTZS
54# if __has_builtin(__builtin_ctzs)
60#define QT_HAS_BUILTIN_CLZS
63# if __has_builtin(__builtin_clzs)
69#define QT_HAS_BUILTIN_CTZ
74#define QT_HAS_BUILTIN_CLZ
79#define QT_HAS_BUILTIN_CTZLL
84#define QT_HAS_BUILTIN_CLZLL
89#define QALGORITHMS_USE_BUILTIN_POPCOUNT
102#define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
107#elif defined(Q_CC_MSVC) && !defined(Q_PROCESSOR_ARM)
108#define QT_HAS_BUILTIN_CTZ
115#define QT_HAS_BUILTIN_CLZ
126#if Q_PROCESSOR_WORDSIZE == 8
128#define QT_HAS_BUILTIN_CTZLL
136#define QT_HAS_BUILTIN_CLZLL
146# define QT_HAS_BUILTIN_CTZS
151#define QT_HAS_BUILTIN_CLZS
166#if defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
167#define QT_POPCOUNT_CONSTEXPR
168#define QT_POPCOUNT_RELAXED_CONSTEXPR
169#define QALGORITHMS_USE_BUILTIN_POPCOUNT
170#define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
185#if Q_PROCESSOR_WORDSIZE == 8
196#ifndef QT_POPCOUNT_CONSTEXPR
197#define QT_POPCOUNT_CONSTEXPR constexpr
198#define QT_POPCOUNT_RELAXED_CONSTEXPR constexpr
205#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
206 return std::popcount(v);
207#elif defined QALGORITHMS_USE_BUILTIN_POPCOUNT
208 return QAlgorithmsPrivate::qt_builtin_popcount(v);
212 (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
213 (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
214 (((v >> 24) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
220#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
221 return std::popcount(v);
222#elif defined QALGORITHMS_USE_BUILTIN_POPCOUNT
223 return QAlgorithmsPrivate::qt_builtin_popcount(v);
226 (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
232#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
233 return std::popcount(v);
234#elif defined QALGORITHMS_USE_BUILTIN_POPCOUNT
235 return QAlgorithmsPrivate::qt_builtin_popcount(v);
238 (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
239 (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
245#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
246 return std::popcount(v);
247#elif defined QALGORITHMS_USE_BUILTIN_POPCOUNTLL
248 return QAlgorithmsPrivate::qt_builtin_popcountll(v);
251 (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
252 (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
253 (((v >> 24) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
254 (((v >> 36) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
255 (((v >> 48) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
256 (((v >> 60) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
262 return qPopulationCount(
static_cast<quint64>(v));
265#if defined(QALGORITHMS_USE_BUILTIN_POPCOUNT)
266#undef QALGORITHMS_USE_BUILTIN_POPCOUNT
268#undef QT_POPCOUNT_CONSTEXPR
277 if (v & 0x0000FFFF) c -= 16;
278 if (v & 0x00FF00FF) c -= 8;
279 if (v & 0x0F0F0F0F) c -= 4;
280 if (v & 0x33333333) c -= 2;
281 if (v & 0x55555555) c -= 1;
287 quint32 x =
static_cast<quint32>(v);
288 return x ? qConstexprCountTrailingZeroBits(x)
289 : 32 + qConstexprCountTrailingZeroBits(
static_cast<quint32>(v >> 32));
295 v &= quint8(-
signed(v));
297 if (v & 0x0000000F) c -= 4;
298 if (v & 0x00000033) c -= 2;
299 if (v & 0x00000055) c -= 1;
306 v &= quint16(-
signed(v));
308 if (v & 0x000000FF) c -= 8;
309 if (v & 0x00000F0F) c -= 4;
310 if (v & 0x00003333) c -= 2;
311 if (v & 0x00005555) c -= 1;
317 return qConstexprCountTrailingZeroBits(QIntegerForSizeof<
long>::Unsigned(v));
323#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
324 return std::countr_zero(v);
325#elif defined(QT_HAS_BUILTIN_CTZ)
326 return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 32U;
328 return QtPrivate::qConstexprCountTrailingZeroBits(v);
334#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
335 return std::countr_zero(v);
336#elif defined(QT_HAS_BUILTIN_CTZ)
337 return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 8U;
339 return QtPrivate::qConstexprCountTrailingZeroBits(v);
345#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
346 return std::countr_zero(v);
347#elif defined(QT_HAS_BUILTIN_CTZS)
348 return v ? QAlgorithmsPrivate::qt_builtin_ctzs(v) : 16U;
350 return QtPrivate::qConstexprCountTrailingZeroBits(v);
356#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
357 return std::countr_zero(v);
358#elif defined(QT_HAS_BUILTIN_CTZLL)
359 return v ? QAlgorithmsPrivate::qt_builtin_ctzll(v) : 64;
361 return QtPrivate::qConstexprCountTrailingZeroBits(v);
367 return qCountTrailingZeroBits(QIntegerForSizeof<
long>::Unsigned(v));
372#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
373 return std::countl_zero(v);
374#elif defined(QT_HAS_BUILTIN_CLZ)
375 return v ? QAlgorithmsPrivate::qt_builtin_clz(v) : 32U;
383 return qPopulationCount(~v);
389#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
390 return std::countl_zero(v);
391#elif defined(QT_HAS_BUILTIN_CLZ)
392 return v ? QAlgorithmsPrivate::qt_builtin_clz(v)-24U : 8U;
397 return qPopulationCount(
static_cast<quint8>(~v));
403#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
404 return std::countl_zero(v);
405#elif defined(QT_HAS_BUILTIN_CLZS)
406 return v ? QAlgorithmsPrivate::qt_builtin_clzs(v) : 16U;
412 return qPopulationCount(
static_cast<quint16>(~v));
418#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
419 return std::countl_zero(v);
420#elif defined(QT_HAS_BUILTIN_CLZLL)
421 return v ? QAlgorithmsPrivate::qt_builtin_clzll(v) : 64U;
429 return qPopulationCount(~v);
435 return qCountLeadingZeroBits(QIntegerForSizeof<
long>::Unsigned(v));
438#undef QT_POPCOUNT_RELAXED_CONSTEXPR
440template <
typename InputIterator,
typename Result,
typename Separator = Result,
442Result
qJoin(InputIterator first, InputIterator last, Result init,
const Separator &separator = {},
446 init += std::invoke(p, *first);
450 while (first != last) {
452 init += std::invoke(p, *first);
469 return int(
sizeof(T) * 8 - 1 - qCountLeadingZeroBits(x));
static constexpr T fromSpecial(T source)
static constexpr T toSpecial(T source)
static constexpr T fromSpecial(T source)
static constexpr T toSpecial(T source)
bool operator!=(QSpecialInteger< S > i) const
static constexpr QSpecialInteger max()
QSpecialInteger & operator>>=(T i)
constexpr QSpecialInteger(T i)
QSpecialInteger & operator++()
bool operator==(QSpecialInteger< S > i) const
QSpecialInteger & operator=(T i)
QSpecialInteger operator++(int)
QSpecialInteger & operator&=(T i)
QSpecialInteger & operator+=(T i)
QSpecialInteger & operator|=(T i)
QSpecialInteger & operator--()
QSpecialInteger & operator*=(T i)
QSpecialInteger operator--(int)
QSpecialInteger & operator^=(T i)
QSpecialInteger()=default
QSpecialInteger & operator%=(T i)
QSpecialInteger & operator/=(T i)
static constexpr QSpecialInteger min()
QSpecialInteger & operator-=(T i)
Combined button and popup list for selecting options.
constexpr uint qConstexprCountTrailingZeroBits(quint32 v) noexcept
constexpr uint qConstexprCountTrailingZeroBits(unsigned long v) noexcept
constexpr std::enable_if_t< std::conjunction_v< std::is_integral< T >, std::is_unsigned< T > >, int > log2i(T x)
QT_POPCOUNT_RELAXED_CONSTEXPR uint qCountLeadingZeroBits(unsigned long v) noexcept
void qDeleteAll(const Container &c)
QT_POPCOUNT_RELAXED_CONSTEXPR uint qCountLeadingZeroBits(quint32 v) noexcept
constexpr uint qCountTrailingZeroBits(quint32 v) noexcept
#define QT_POPCOUNT_CONSTEXPR
constexpr uint qCountTrailingZeroBits(unsigned long v) noexcept
#define QT_POPCOUNT_RELAXED_CONSTEXPR
Result qJoin(InputIterator first, InputIterator last, Result init, const Separator &separator={}, Projection p={})
static Q_ALWAYS_INLINE void * bswapLoop(const uchar *src, size_t n, uchar *dst) noexcept
void * qbswap< 2 >(const void *source, qsizetype n, void *dest) noexcept
QBEInteger< quint64 > quint64_be
float qbswap(float source)
void qToLittleEndian(T src, void *dest)
void qToLittleEndian(const void *source, qsizetype count, void *dest)
QLEInteger< qint64 > qint64_le
void qToBigEndian(T src, void *dest)
QBEInteger< qint32 > qint32_be
QLEInteger< qint32 > qint32_le
void qFromLittleEndian(const void *source, qsizetype count, void *dest)
void qbswap(const T src, void *dest)
QBEInteger< qint64 > qint64_be
QLEInteger< quint32 > quint32_le
QLEInteger< quint64 > quint64_le
constexpr quint64 qbswap_helper(quint64 source)
qfloat16 qbswap(qfloat16 source)
void * qbswap(const void *source, qsizetype count, void *dest) noexcept
QBEInteger< quint32 > quint32_be
constexpr T qFromLittleEndian(T source)
constexpr T qToBigEndian(T source)
QLEInteger< quint16 > quint16_le
T qFromLittleEndian(const void *src)
QLEInteger< qint16 > qint16_le
constexpr T qFromBigEndian(T source)
QBEInteger< qint16 > qint16_be
void qToBigEndian(const void *source, qsizetype count, void *dest)
QBEInteger< quint16 > quint16_be
T qFromBigEndian(const void *src)
double qbswap(double source)
void qFromBigEndian(const void *source, qsizetype count, void *dest)
constexpr T qToLittleEndian(T source)
Float qbswapFloatHelper(Float source)