diff options
Diffstat (limited to 'qmake/library/proitems.h')
-rw-r--r-- | qmake/library/proitems.h | 203 |
1 files changed, 107 insertions, 96 deletions
diff --git a/qmake/library/proitems.h b/qmake/library/proitems.h index 4569d7c3ff..2de982034c 100644 --- a/qmake/library/proitems.h +++ b/qmake/library/proitems.h @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the qmake application of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef PROITEMS_H #define PROITEMS_H @@ -32,9 +7,10 @@ #include "qmake_global.h" #include <qdebug.h> -#include <qstring.h> -#include <qvector.h> #include <qhash.h> +#include <qlist.h> +#include <qmap.h> +#include <qstring.h> QT_BEGIN_NAMESPACE @@ -69,9 +45,16 @@ public: ProString(); ProString(const ProString &other); ProString &operator=(const ProString &) = default; - PROITEM_EXPLICIT ProString(const QString &str); - PROITEM_EXPLICIT ProString(const QStringRef &str); + template<typename A, typename B> + ProString &operator=(const QStringBuilder<A, B> &str) + { return *this = QString(str); } + ProString(const QString &str); + PROITEM_EXPLICIT ProString(QStringView str); PROITEM_EXPLICIT ProString(const char *str); + template<typename A, typename B> + ProString(const QStringBuilder<A, B> &str) + : ProString(QString(str)) + {} ProString(const QString &str, int offset, int length); void setValue(const QString &str); void clear() { m_string.clear(); m_length = 0; } @@ -82,12 +65,16 @@ public: ProString &prepend(const ProString &other); ProString &append(const ProString &other, bool *pending = nullptr); ProString &append(const QString &other) { return append(ProString(other)); } + template<typename A, typename B> + ProString &append(const QStringBuilder<A, B> &other) { return append(QString(other)); } ProString &append(const QLatin1String other); ProString &append(const char *other) { return append(QLatin1String(other)); } ProString &append(QChar other); ProString &append(const ProStringList &other, bool *pending = nullptr, bool skipEmpty1st = false); ProString &operator+=(const ProString &other) { return append(other); } ProString &operator+=(const QString &other) { return append(other); } + template<typename A, typename B> + ProString &operator+=(const QStringBuilder<A, B> &other) { return append(QString(other)); } ProString &operator+=(const QLatin1String other) { return append(other); } ProString &operator+=(const char *other) { return append(other); } ProString &operator+=(QChar other) { return append(other); } @@ -95,16 +82,16 @@ public: void chop(int n) { Q_ASSERT(n <= m_length); m_length -= n; } void chopFront(int n) { Q_ASSERT(n <= m_length); m_offset += n; m_length -= n; } - bool operator==(const ProString &other) const { return toQStringRef() == other.toQStringRef(); } - bool operator==(const QString &other) const { return toQStringRef() == other; } - bool operator==(const QStringRef &other) const { return toQStringRef() == other; } - bool operator==(QLatin1String other) const { return toQStringRef() == other; } - bool operator==(const char *other) const { return toQStringRef() == QLatin1String(other); } + bool operator==(const ProString &other) const { return toQStringView() == other.toQStringView(); } + bool operator==(const QString &other) const { return toQStringView() == other; } + bool operator==(QStringView other) const { return toQStringView() == other; } + bool operator==(QLatin1String other) const { return toQStringView() == other; } + bool operator==(const char *other) const { return toQStringView() == QLatin1String(other); } bool operator!=(const ProString &other) const { return !(*this == other); } bool operator!=(const QString &other) const { return !(*this == other); } bool operator!=(QLatin1String other) const { return !(*this == other); } bool operator!=(const char *other) const { return !(*this == other); } - bool operator<(const ProString &other) const { return toQStringRef() < other.toQStringRef(); } + bool operator<(const ProString &other) const { return toQStringView() < other.toQStringView(); } bool isNull() const { return m_string.isNull(); } bool isEmpty() const { return !m_length; } int length() const { return m_length; } @@ -115,34 +102,37 @@ public: ProString left(int len) const { return mid(0, len); } ProString right(int len) const { return mid(qMax(0, size() - len)); } ProString trimmed() const; - int compare(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().compare(sub.toQStringRef(), cs); } - int compare(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().compare(sub, cs); } - int compare(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().compare(QLatin1String(sub), cs); } - bool startsWith(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().startsWith(sub.toQStringRef(), cs); } - bool startsWith(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().startsWith(sub, cs); } - bool startsWith(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().startsWith(QLatin1String(sub), cs); } - bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().startsWith(c, cs); } - bool endsWith(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().endsWith(sub.toQStringRef(), cs); } - bool endsWith(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().endsWith(sub, cs); } - bool endsWith(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().endsWith(QLatin1String(sub), cs); } - bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().endsWith(c, cs); } - int indexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(s, from, cs); } - int indexOf(const char *s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(QLatin1String(s), from, cs); } - int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(c, from, cs); } - int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(s, from, cs); } - int lastIndexOf(const char *s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(QLatin1String(s), from, cs); } - int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(c, from, cs); } + int compare(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().compare(sub.toQStringView(), cs); } + int compare(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().compare(sub, cs); } + int compare(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().compare(QLatin1String(sub), cs); } + bool startsWith(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().startsWith(sub.toQStringView(), cs); } + bool startsWith(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().startsWith(sub, cs); } + bool startsWith(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().startsWith(QLatin1String(sub), cs); } + bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().startsWith(c, cs); } + template<typename A, typename B> + bool startsWith(const QStringBuilder<A, B> &str) { return startsWith(QString(str)); } + bool endsWith(const ProString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().endsWith(sub.toQStringView(), cs); } + bool endsWith(const QString &sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().endsWith(sub, cs); } + bool endsWith(const char *sub, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().endsWith(QLatin1String(sub), cs); } + template<typename A, typename B> + bool endsWith(const QStringBuilder<A, B> &str) { return endsWith(QString(str)); } + bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().endsWith(c, cs); } + int indexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().indexOf(s, from, cs); } + int indexOf(const char *s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().indexOf(QLatin1String(s), from, cs); } + int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().indexOf(c, from, cs); } + int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().lastIndexOf(s, from, cs); } + int lastIndexOf(const char *s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().lastIndexOf(QLatin1String(s), from, cs); } + int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringView().lastIndexOf(c, from, cs); } bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(s, 0, cs) >= 0; } bool contains(const char *s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(QLatin1String(s), 0, cs) >= 0; } bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(c, 0, cs) >= 0; } - qlonglong toLongLong(bool *ok = nullptr, int base = 10) const { return toQStringRef().toLongLong(ok, base); } - int toInt(bool *ok = nullptr, int base = 10) const { return toQStringRef().toInt(ok, base); } - short toShort(bool *ok = nullptr, int base = 10) const { return toQStringRef().toShort(ok, base); } + qlonglong toLongLong(bool *ok = nullptr, int base = 10) const { return toQStringView().toLongLong(ok, base); } + int toInt(bool *ok = nullptr, int base = 10) const { return toQStringView().toInt(ok, base); } + short toShort(bool *ok = nullptr, int base = 10) const { return toQStringView().toShort(ok, base); } - uint hash() const { return m_hash; } - static uint hash(const QChar *p, int n); + size_t hash() const { return m_hash; } + static size_t hash(const QChar *p, int n); - ALWAYS_INLINE QStringRef toQStringRef() const { return QStringRef(&m_string, m_offset, m_length); } ALWAYS_INLINE QStringView toQStringView() const { return QStringView(m_string).mid(m_offset, m_length); } ALWAYS_INLINE ProKey &toKey() { return *(ProKey *)this; } @@ -151,7 +141,7 @@ public: QString toQString() const; QString &toQString(QString &tmp) const; - QByteArray toLatin1() const { return toQStringRef().toLatin1(); } + QByteArray toLatin1() const { return toQStringView().toLatin1(); } private: ProString(const ProKey &other); @@ -169,19 +159,23 @@ private: QString m_string; int m_offset, m_length; int m_file; - mutable uint m_hash; - QChar *prepareExtend(int extraLen, int thisTarget, int extraTarget); - uint updatedHash() const; - friend uint qHash(const ProString &str); + mutable size_t m_hash; + size_t updatedHash() const; + friend size_t qHash(const ProString &str); friend QString operator+(const ProString &one, const ProString &two); friend class ProKey; }; -Q_DECLARE_TYPEINFO(ProString, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(ProString, Q_RELOCATABLE_TYPE); + class ProKey : public ProString { public: ALWAYS_INLINE ProKey() : ProString() {} explicit ProKey(const QString &str); + template<typename A, typename B> + ProKey(const QStringBuilder<A, B> &str) + : ProString(str) + {} PROITEM_EXPLICIT ProKey(const char *str); ProKey(const QString &str, int off, int len); ProKey(const QString &str, int off, int len, uint hash); @@ -203,33 +197,49 @@ public: private: ProKey(const ProString &other); }; -Q_DECLARE_TYPEINFO(ProKey, Q_MOVABLE_TYPE); - -uint qHash(const ProString &str); -QString operator+(const ProString &one, const ProString &two); -inline QString operator+(const ProString &one, const QString &two) - { return one.toQStringRef() + two; } -inline QString operator+(const QString &one, const ProString &two) - { return one + two.toQStringRef(); } - -inline QString operator+(const ProString &one, const char *two) - { return one.toQStringRef() + QLatin1String(two); } -inline QString operator+(const char *one, const ProString &two) - { return QLatin1String(one) + two.toQStringRef(); } -inline QString operator+(const ProString &one, QChar two) - { return one.toQStringRef() + two; } -inline QString operator+(QChar one, const ProString &two) - { return one + two.toQStringRef(); } +Q_DECLARE_TYPEINFO(ProKey, Q_RELOCATABLE_TYPE); -inline QString &operator+=(QString &that, const ProString &other) - { return that += other.toQStringRef(); } +template <> struct QConcatenable<ProString> : private QAbstractConcatenable +{ + typedef ProString type; + typedef QString ConvertTo; + enum { ExactSize = true }; + static int size(const ProString &a) { return a.length(); } + static inline void appendTo(const ProString &a, QChar *&out) + { + const auto n = a.size(); + if (!n) + return; + memcpy(out, a.toQStringView().data(), sizeof(QChar) * n); + out += n; + } +}; -inline bool operator==(const QString &that, const ProString &other) - { return other == that; } -inline bool operator!=(const QString &that, const ProString &other) - { return !(other == that); } +template <> struct QConcatenable<ProKey> : private QAbstractConcatenable +{ + typedef ProKey type; + typedef QString ConvertTo; + enum { ExactSize = true }; + static int size(const ProKey &a) { return a.length(); } + static inline void appendTo(const ProKey &a, QChar *&out) + { + const auto n = a.size(); + if (!n) + return; + memcpy(out, a.toQStringView().data(), sizeof(QChar) * n); + out += n; + } +}; + + +size_t qHash(const ProString &str); + +inline QString &operator+=(QString &that, const ProString &other) + { return that += other.toQStringView(); } QTextStream &operator<<(QTextStream &t, const ProString &str); +template<typename A, typename B> +QTextStream &operator<<(QTextStream &t, const QStringBuilder<A, B> &str) { return t << QString(str); } // This class manages read-only access to a ProString via a raw data QString // temporary, ensuring that the latter is accessed exclusively. @@ -238,7 +248,6 @@ class ProStringRoUser public: ProStringRoUser(QString &rs) { - Q_ASSERT(rs.isDetached() || rs.isEmpty()); m_rs = &rs; } ProStringRoUser(const ProString &ps, QString &rs) @@ -280,7 +289,7 @@ private: const ProString *m_ps; }; -class ProStringList : public QVector<ProString> { +class ProStringList : public QList<ProString> { public: ProStringList() {} ProStringList(const ProString &str) { *this << str; } @@ -288,13 +297,15 @@ public: QStringList toQStringList() const; ProStringList &operator<<(const ProString &str) - { QVector<ProString>::operator<<(str); return *this; } + { QList<ProString>::operator<<(str); return *this; } int length() const { return size(); } QString join(const ProString &sep) const; QString join(const QString &sep) const; QString join(QChar sep) const; + template<typename A, typename B> + QString join(const QStringBuilder<A, B> &str) { return join(QString(str)); } void insertUnique(const ProStringList &value); @@ -306,17 +317,17 @@ public: void removeDuplicates(); bool contains(const ProString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return contains(ProString(str), cs); } bool contains(const char *str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; }; -Q_DECLARE_TYPEINFO(ProStringList, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(ProStringList, Q_RELOCATABLE_TYPE); inline ProStringList operator+(const ProStringList &one, const ProStringList &two) { ProStringList ret = one; ret += two; return ret; } -typedef QHash<ProKey, ProStringList> ProValueMap; +typedef QMap<ProKey, ProStringList> ProValueMap; // These token definitions affect both ProFileEvaluator and ProWriter enum ProToken { @@ -464,7 +475,7 @@ private: int m_offset; }; -Q_DECLARE_TYPEINFO(ProFunctionDef, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(ProFunctionDef, Q_RELOCATABLE_TYPE); struct ProFunctionDefs { QHash<ProKey, ProFunctionDef> testFunctions; |