Revision control
Copy as Markdown
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QALGORITHMS_H
#define QALGORITHMS_H
#if 0
#pragma qt_class(QtAlgorithms)
#endif
#include <QtCore/qglobal.h>
#include <QtCore/q20bit.h>
#include <QtCore/q20functional.h>
#include <type_traits>
#define QT_HAS_CONSTEXPR_BITOPS
QT_BEGIN_NAMESPACE
template <typename ForwardIterator>
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{
while (begin != end) {
delete *begin;
++begin;
}
}
template <typename Container>
inline void qDeleteAll(const Container &c)
{
qDeleteAll(c.begin(), c.end());
}
Q_DECL_CONST_FUNCTION constexpr inline uint qPopulationCount(quint32 v) noexcept
{
return q20::popcount(v);
}
Q_DECL_CONST_FUNCTION constexpr inline uint qPopulationCount(quint8 v) noexcept
{
return q20::popcount(v);
}
Q_DECL_CONST_FUNCTION constexpr inline uint qPopulationCount(quint16 v) noexcept
{
return q20::popcount(v);
}
Q_DECL_CONST_FUNCTION constexpr inline uint qPopulationCount(quint64 v) noexcept
{
return q20::popcount(v);
}
Q_DECL_CONST_FUNCTION constexpr inline uint qPopulationCount(long unsigned int v) noexcept
{
return q20::popcount(v);
}
constexpr inline uint qCountTrailingZeroBits(quint32 v) noexcept
{
return q20::countr_zero(v);
}
constexpr inline uint qCountTrailingZeroBits(quint8 v) noexcept
{
return q20::countr_zero(v);
}
constexpr inline uint qCountTrailingZeroBits(quint16 v) noexcept
{
return q20::countr_zero(v);
}
constexpr inline uint qCountTrailingZeroBits(quint64 v) noexcept
{
return q20::countr_zero(v);
}
constexpr inline uint qCountTrailingZeroBits(unsigned long v) noexcept
{
return q20::countr_zero(v);
}
constexpr inline uint qCountLeadingZeroBits(quint32 v) noexcept
{
return q20::countl_zero(v);
}
constexpr inline uint qCountLeadingZeroBits(quint8 v) noexcept
{
return q20::countl_zero(v);
}
constexpr inline uint qCountLeadingZeroBits(quint16 v) noexcept
{
return q20::countl_zero(v);
}
constexpr inline uint qCountLeadingZeroBits(quint64 v) noexcept
{
return q20::countl_zero(v);
}
constexpr inline uint qCountLeadingZeroBits(unsigned long v) noexcept
{
return q20::countl_zero(v);
}
template <typename InputIterator, typename Result, typename Separator = Result,
typename Projection = q20::identity>
Result qJoin(InputIterator first, InputIterator last, Result init, const Separator &separator = {},
Projection p = {})
{
if (first != last) {
init += std::invoke(p, *first);
++first;
}
while (first != last) {
init += separator;
init += std::invoke(p, *first);
++first;
}
return init;
}
namespace QtPrivate {
template <typename T>
constexpr
std::enable_if_t<std::conjunction_v<std::is_integral<T>, std::is_unsigned<T>>, int>
log2i(T x)
{
// Integral -> int version of std::log2():
Q_ASSERT(x > 0); // Q_PRE
// C++20: return std::bit_width(x) - 1
return int(sizeof(T) * 8 - 1 - qCountLeadingZeroBits(x));
}
} // namespace QtPrivate
QT_END_NAMESPACE
#endif // QALGORITHMS_H