summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2020-07-24 12:29:51 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2020-08-19 19:48:10 +0200
commit3398eeadf617880af38fb540f26273df87ba0b1f (patch)
tree5d1261b202d813c6e579c4bff0f68df33d2a2769 /src/corelib/serialization
parent551eef1aa6d8b0e71b68072bcb6c7a71e39e1222 (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.cpp62
-rw-r--r--src/corelib/serialization/qxmlstream.h61
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 &notationDeclaration = 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: