diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-07-24 12:29:51 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-08-19 19:48:10 +0200 |
commit | 3398eeadf617880af38fb540f26273df87ba0b1f (patch) | |
tree | 5d1261b202d813c6e579c4bff0f68df33d2a2769 /src/corelib/serialization | |
parent | 551eef1aa6d8b0e71b68072bcb6c7a71e39e1222 (diff) |
Refactor QXmlStreamStringRef
Use a QStringPrivate inside the implementation. This saves
two pointers, and actually makes this a safe replacement for
QStringRef inside the implementation of QXmlStreamReader.
Unexport the class as all members are inline, and move it
into the QtPrivate namespace as class QXmlString.
Change-Id: I43fa4684f569514c8c621838dcc346657ac1a915
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/corelib/serialization')
-rw-r--r-- | src/corelib/serialization/qxmlstream.cpp | 62 | ||||
-rw-r--r-- | src/corelib/serialization/qxmlstream.h | 61 |
2 files changed, 66 insertions, 57 deletions
diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index 06c41bfbff..e242340f7b 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -75,6 +75,8 @@ private: QT_BEGIN_NAMESPACE +using namespace QtPrivate; + enum { StreamEOF = ~0U }; namespace { @@ -1608,13 +1610,13 @@ void QXmlStreamReaderPrivate::resolveTag() QStringRef qualifiedName(symName(attrib.key)); QStringRef value(symString(attrib.value)); - attribute.m_name = QXmlStreamStringRef(name); - attribute.m_qualifiedName = QXmlStreamStringRef(qualifiedName); - attribute.m_value = QXmlStreamStringRef(value); + attribute.m_name = name; + attribute.m_qualifiedName = qualifiedName; + attribute.m_value = value; if (!prefix.isEmpty()) { QStringRef attributeNamespaceUri = namespaceForPrefix(prefix); - attribute.m_namespaceUri = QXmlStreamStringRef(attributeNamespaceUri); + attribute.m_namespaceUri = attributeNamespaceUri; } for (qsizetype j = 0; j < i; ++j) { @@ -1643,13 +1645,13 @@ void QXmlStreamReaderPrivate::resolveTag() QXmlStreamAttribute attribute; - attribute.m_name = QXmlStreamStringRef(dtdAttribute.attributeName); - attribute.m_qualifiedName = QXmlStreamStringRef(dtdAttribute.attributeQualifiedName); - attribute.m_value = QXmlStreamStringRef(dtdAttribute.defaultValue); + attribute.m_name = dtdAttribute.attributeName; + attribute.m_qualifiedName = dtdAttribute.attributeQualifiedName; + attribute.m_value = dtdAttribute.defaultValue; if (!dtdAttribute.attributePrefix.isEmpty()) { QStringRef attributeNamespaceUri = namespaceForPrefix(dtdAttribute.attributePrefix); - attribute.m_namespaceUri = QXmlStreamStringRef(attributeNamespaceUri); + attribute.m_namespaceUri = attributeNamespaceUri; } attribute.m_isDefault = true; attributes.append(std::move(attribute)); @@ -1664,8 +1666,8 @@ void QXmlStreamReaderPrivate::resolvePublicNamespaces() for (qsizetype i = 0; i < n; ++i) { const NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.at(tag.namespaceDeclarationsSize + i); QXmlStreamNamespaceDeclaration &publicNamespaceDeclaration = publicNamespaceDeclarations[i]; - publicNamespaceDeclaration.m_prefix = QXmlStreamStringRef(namespaceDeclaration.prefix); - publicNamespaceDeclaration.m_namespaceUri = QXmlStreamStringRef(namespaceDeclaration.namespaceUri); + publicNamespaceDeclaration.m_prefix = namespaceDeclaration.prefix; + publicNamespaceDeclaration.m_namespaceUri = namespaceDeclaration.namespaceUri; } } @@ -1675,9 +1677,9 @@ void QXmlStreamReaderPrivate::resolveDtd() for (qsizetype i = 0; i < notationDeclarations.size(); ++i) { const QXmlStreamReaderPrivate::NotationDeclaration ¬ationDeclaration = notationDeclarations.at(i); QXmlStreamNotationDeclaration &publicNotationDeclaration = publicNotationDeclarations[i]; - publicNotationDeclaration.m_name = QXmlStreamStringRef(notationDeclaration.name); - publicNotationDeclaration.m_systemId = QXmlStreamStringRef(notationDeclaration.systemId); - publicNotationDeclaration.m_publicId = QXmlStreamStringRef(notationDeclaration.publicId); + publicNotationDeclaration.m_name = notationDeclaration.name; + publicNotationDeclaration.m_systemId = notationDeclaration.systemId; + publicNotationDeclaration.m_publicId = notationDeclaration.publicId; } notationDeclarations.clear(); @@ -1685,11 +1687,11 @@ void QXmlStreamReaderPrivate::resolveDtd() for (qsizetype i = 0; i < entityDeclarations.size(); ++i) { const QXmlStreamReaderPrivate::EntityDeclaration &entityDeclaration = entityDeclarations.at(i); QXmlStreamEntityDeclaration &publicEntityDeclaration = publicEntityDeclarations[i]; - publicEntityDeclaration.m_name = QXmlStreamStringRef(entityDeclaration.name); - publicEntityDeclaration.m_notationName = QXmlStreamStringRef(entityDeclaration.notationName); - publicEntityDeclaration.m_systemId = QXmlStreamStringRef(entityDeclaration.systemId); - publicEntityDeclaration.m_publicId = QXmlStreamStringRef(entityDeclaration.publicId); - publicEntityDeclaration.m_value = QXmlStreamStringRef(entityDeclaration.value); + publicEntityDeclaration.m_name = entityDeclaration.name; + publicEntityDeclaration.m_notationName = entityDeclaration.notationName; + publicEntityDeclaration.m_systemId = entityDeclaration.systemId; + publicEntityDeclaration.m_publicId = entityDeclaration.publicId; + publicEntityDeclaration.m_value = entityDeclaration.value; } entityDeclarations.clear(); parameterEntityHash.clear(); @@ -2294,10 +2296,10 @@ QXmlStreamAttribute::QXmlStreamAttribute() */ QXmlStreamAttribute::QXmlStreamAttribute(const QString &namespaceUri, const QString &name, const QString &value) { - m_namespaceUri = QXmlStreamStringRef(QStringRef(&namespaceUri)); - m_name = m_qualifiedName = QXmlStreamStringRef(QStringRef(&name)); - m_value = QXmlStreamStringRef(QStringRef(&value)); - m_namespaceUri = QXmlStreamStringRef(QStringRef(&namespaceUri)); + m_namespaceUri = QStringRef(&namespaceUri); + m_name = m_qualifiedName = QStringRef(&name); + m_value = QStringRef(&value); + m_namespaceUri = QStringRef(&namespaceUri); } /*! @@ -2306,11 +2308,9 @@ QXmlStreamAttribute::QXmlStreamAttribute(const QString &namespaceUri, const QStr QXmlStreamAttribute::QXmlStreamAttribute(const QString &qualifiedName, const QString &value) { int colon = qualifiedName.indexOf(QLatin1Char(':')); - m_name = QXmlStreamStringRef(QStringRef(&qualifiedName, - colon + 1, - qualifiedName.size() - (colon + 1))); - m_qualifiedName = QXmlStreamStringRef(QStringRef(&qualifiedName)); - m_value = QXmlStreamStringRef(QStringRef(&value)); + m_name = QStringRef(&qualifiedName, colon + 1, qualifiedName.size() - (colon + 1)); + m_qualifiedName = QStringRef(&qualifiedName); + m_value = QStringRef(&value); } /*! \fn QStringView QXmlStreamAttribute::namespaceUri() const @@ -2508,9 +2508,9 @@ Returns the namespaceUri. */ /*! - \class QXmlStreamStringRef + \class QXmlString \inmodule QtCore - \since 4.3 + \since 6.0 \internal */ @@ -2534,8 +2534,8 @@ QXmlStreamEntityDeclaration::QXmlStreamEntityDeclaration() { } -/*! \fn QXmlStreamStringRef::swap(QXmlStreamStringRef &other) - \since 5.6 +/*! \fn QXmlString::swap(QXmlString &other) + \since 6.0 Swaps this string reference's contents with \a other. This function is very fast and never fails. diff --git a/src/corelib/serialization/qxmlstream.h b/src/corelib/serialization/qxmlstream.h index 572dd2b211..c767c2dd4c 100644 --- a/src/corelib/serialization/qxmlstream.h +++ b/src/corelib/serialization/qxmlstream.h @@ -50,34 +50,43 @@ QT_BEGIN_NAMESPACE - -class Q_CORE_EXPORT QXmlStreamStringRef { - QString m_string; - int m_position, m_size; -public: - inline QXmlStreamStringRef():m_position(0), m_size(0){} - inline QXmlStreamStringRef(const QStringRef &aString) - :m_string(aString.string()?*aString.string():QString()), m_position(aString.position()), m_size(aString.size()){} - QXmlStreamStringRef(const QString &aString) : m_string(aString), m_position(0), m_size(m_string.size()) {} - QXmlStreamStringRef(QString &&aString) noexcept : m_string(std::move(aString)), m_position(0), m_size(m_string.size()) {} - - void swap(QXmlStreamStringRef &other) noexcept - { - qSwap(m_string, other.m_string); - qSwap(m_position, other.m_position); - qSwap(m_size, other.m_size); - } - - inline operator QStringView() const { return QStringView(m_string.constData() + m_position, m_size); } - inline int size() const { return m_size; } -}; -Q_DECLARE_SHARED(QXmlStreamStringRef) +namespace QtPrivate { + class QXmlString { + QStringPrivate m_string; + public: + inline constexpr QXmlString() {} + inline QXmlString(const QStringRef &aString) + { + if (!aString.string()) + return; + m_string = aString.string()->data_ptr(); + m_string = { m_string.d_ptr(), m_string.data() + aString.position(), size_t(aString.size()) }; + // need to manually call ref(), as the constructor above does not do it + m_string.ref(); + } + QXmlString(const QString &aString) : m_string(aString.data_ptr()) {} + QXmlString(QString &&aString) noexcept + { qSwap(m_string, aString.data_ptr()); } + + QXmlString &operator=(const QStringRef &s) + { *this = QXmlString(s); return *this; } + + void swap(QXmlString &other) noexcept + { + qSwap(m_string, other.m_string); + } + + inline operator QStringView() const { return QStringView(m_string.data(), m_string.size); } + inline int size() const { return m_string.size; } + }; +} +Q_DECLARE_SHARED(QtPrivate::QXmlString) class QXmlStreamReaderPrivate; class QXmlStreamAttributes; class Q_CORE_EXPORT QXmlStreamAttribute { - QXmlStreamStringRef m_name, m_namespaceUri, m_qualifiedName, m_value; + QtPrivate::QXmlString m_name, m_namespaceUri, m_qualifiedName, m_value; uint m_isDefault : 1; friend class QXmlStreamReaderPrivate; friend class QXmlStreamAttributes; @@ -138,7 +147,7 @@ public: }; class Q_CORE_EXPORT QXmlStreamNamespaceDeclaration { - QXmlStreamStringRef m_prefix, m_namespaceUri; + QtPrivate::QXmlString m_prefix, m_namespaceUri; friend class QXmlStreamReaderPrivate; public: @@ -158,7 +167,7 @@ Q_DECLARE_TYPEINFO(QXmlStreamNamespaceDeclaration, Q_MOVABLE_TYPE); typedef QList<QXmlStreamNamespaceDeclaration> QXmlStreamNamespaceDeclarations; class Q_CORE_EXPORT QXmlStreamNotationDeclaration { - QXmlStreamStringRef m_name, m_systemId, m_publicId; + QtPrivate::QXmlString m_name, m_systemId, m_publicId; friend class QXmlStreamReaderPrivate; public: @@ -179,7 +188,7 @@ Q_DECLARE_TYPEINFO(QXmlStreamNotationDeclaration, Q_MOVABLE_TYPE); typedef QList<QXmlStreamNotationDeclaration> QXmlStreamNotationDeclarations; class Q_CORE_EXPORT QXmlStreamEntityDeclaration { - QXmlStreamStringRef m_name, m_notationName, m_systemId, m_publicId, m_value; + QtPrivate::QXmlString m_name, m_notationName, m_systemId, m_publicId, m_value; friend class QXmlStreamReaderPrivate; public: |