// 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 #ifndef QALGORITHMS_H #define QALGORITHMS_H #if 0 #pragma qt_class(QtAlgorithms) #endif #include #include #include #include #define QT_HAS_CONSTEXPR_BITOPS QT_BEGIN_NAMESPACE template Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end) { while (begin != end) { delete *begin; ++begin; } } template 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 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 constexpr std::enable_if_t, std::is_unsigned>, 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