From 089ed1525e80b804a1745484995582e29d08129e Mon Sep 17 00:00:00 2001
From: Anton Kudryavtsev <a.kudryavtsev@netris.ru>
Date: Thu, 3 Mar 2016 15:55:47 +0300
Subject: [PATCH] QtNetwork: optimize container usage

Don't perform lookup twice. Just cache iterator
or position.

Change-Id: I454fd292614dee62167ff248fc3ddec0f79435b0
Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
---
 src/network/access/qnetworkreplyhttpimpl.cpp  | 26 +++++++++++--------
 src/network/access/qnetworkreplyimpl.cpp      | 22 +++++++++-------
 src/network/access/qspdyprotocolhandler.cpp   | 15 ++++++-----
 .../bearer/qnetworkconfigmanager_p.cpp        | 25 ++++++++++--------
 src/network/bearer/qsharednetworksession.cpp  |  5 ++--
 src/network/socket/qsocks5socketengine.cpp    |  6 +++--
 src/network/ssl/qsslcertificate.cpp           |  5 ++--
 7 files changed, 61 insertions(+), 43 deletions(-)

diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index f9547e15089..2f4a1e5462d 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -731,10 +731,11 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
 
     QList<QByteArray> headers = newHttpRequest.rawHeaderList();
     if (resumeOffset != 0) {
-        if (headers.contains("Range")) {
+        const int rangeIndex = headers.indexOf("Range");
+        if (rangeIndex != -1) {
             // Need to adjust resume offset for user specified range
 
-            headers.removeOne("Range");
+            headers.removeAt(rangeIndex);
 
             // We've already verified that requestRange starts with "bytes=", see canResume.
             QByteArray requestRange = newHttpRequest.rawHeader("Range").mid(6);
@@ -2145,15 +2146,18 @@ void QNetworkReplyHttpImplPrivate::_q_metaDataChanged()
     Q_Q(QNetworkReplyHttpImpl);
     // 1. do we have cookies?
     // 2. are we allowed to set them?
-    if (cookedHeaders.contains(QNetworkRequest::SetCookieHeader) && manager
-        && (static_cast<QNetworkRequest::LoadControl>
-            (request.attribute(QNetworkRequest::CookieSaveControlAttribute,
-                               QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic)) {
-        QList<QNetworkCookie> cookies =
-            qvariant_cast<QList<QNetworkCookie> >(cookedHeaders.value(QNetworkRequest::SetCookieHeader));
-        QNetworkCookieJar *jar = manager->cookieJar();
-        if (jar)
-            jar->setCookiesFromUrl(cookies, url);
+    if (manager) {
+        const auto it = cookedHeaders.constFind(QNetworkRequest::SetCookieHeader);
+        if (it != cookedHeaders.cend()
+            && request.attribute(QNetworkRequest::CookieSaveControlAttribute,
+                                 QNetworkRequest::Automatic).toInt() == QNetworkRequest::Automatic) {
+            QNetworkCookieJar *jar = manager->cookieJar();
+            if (jar) {
+                QList<QNetworkCookie> cookies =
+                    qvariant_cast<QList<QNetworkCookie> >(it.value());
+                jar->setCookiesFromUrl(cookies, url);
+            }
+        }
     }
     emit q->metaDataChanged();
 }
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 0f57d1a73b9..4203169cae6 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -871,16 +871,20 @@ void QNetworkReplyImplPrivate::metaDataChanged()
     Q_Q(QNetworkReplyImpl);
     // 1. do we have cookies?
     // 2. are we allowed to set them?
-    if (cookedHeaders.contains(QNetworkRequest::SetCookieHeader) && !manager.isNull()
-        && (static_cast<QNetworkRequest::LoadControl>
-            (request.attribute(QNetworkRequest::CookieSaveControlAttribute,
-                               QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic)) {
-        QList<QNetworkCookie> cookies =
-            qvariant_cast<QList<QNetworkCookie> >(cookedHeaders.value(QNetworkRequest::SetCookieHeader));
-        QNetworkCookieJar *jar = manager->cookieJar();
-        if (jar)
-            jar->setCookiesFromUrl(cookies, url);
+    if (!manager.isNull()) {
+        const auto it = cookedHeaders.constFind(QNetworkRequest::SetCookieHeader);
+        if (it != cookedHeaders.cend()
+            && request.attribute(QNetworkRequest::CookieSaveControlAttribute,
+                                 QNetworkRequest::Automatic).toInt() == QNetworkRequest::Automatic) {
+            QNetworkCookieJar *jar = manager->cookieJar();
+            if (jar) {
+                QList<QNetworkCookie> cookies =
+                    qvariant_cast<QList<QNetworkCookie> >(it.value());
+                jar->setCookiesFromUrl(cookies, url);
+            }
+        }
     }
+
     emit q->metaDataChanged();
 }
 
diff --git a/src/network/access/qspdyprotocolhandler.cpp b/src/network/access/qspdyprotocolhandler.cpp
index f3073dcd3c1..1a6dd04ecb8 100644
--- a/src/network/access/qspdyprotocolhandler.cpp
+++ b/src/network/access/qspdyprotocolhandler.cpp
@@ -872,7 +872,8 @@ void QSpdyProtocolHandler::handleSYN_REPLY(char flags, quint32 /*length*/, const
 void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameData)
 {
     qint32 streamID = getStreamID(frameData.constData());
-    if (!m_inFlightStreams.contains(streamID)) {
+    const auto it = m_inFlightStreams.constFind(streamID);
+    if (it == m_inFlightStreams.cend()) {
         sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
         return;
     }
@@ -882,7 +883,7 @@ void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameD
 
     QByteArray headerValuePairs = frameData.mid(4);
 
-    HttpMessagePair pair = m_inFlightStreams.value(streamID);
+    HttpMessagePair pair = it.value();
     QHttpNetworkReply *httpReply = pair.second;
     Q_ASSERT(httpReply != 0);
 
@@ -1152,12 +1153,13 @@ void QSpdyProtocolHandler::handleWINDOW_UPDATE(char /*flags*/, quint32 /*length*
     qint32 streamID = getStreamID(frameData.constData());
     qint32 deltaWindowSize = fourBytesToInt(frameData.constData() + 4);
 
-    if (!m_inFlightStreams.contains(streamID)) {
+    const auto it = m_inFlightStreams.constFind(streamID);
+    if (it == m_inFlightStreams.cend()) {
         sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
         return;
     }
 
-    QHttpNetworkReply *reply = m_inFlightStreams.value(streamID).second;
+    QHttpNetworkReply *reply = it.value().second;
     Q_ASSERT(reply);
     QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
     Q_ASSERT(replyPrivate);
@@ -1176,7 +1178,8 @@ void QSpdyProtocolHandler::handleDataFrame(const QByteArray &frameHeaders)
     Q_ASSERT(frameHeaders.count() >= 8);
 
     qint32 streamID = getStreamID(frameHeaders.constData());
-    if (!m_inFlightStreams.contains(streamID)) {
+    const auto it = m_inFlightStreams.constFind(streamID);
+    if (it == m_inFlightStreams.cend()) {
         sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
         return;
     }
@@ -1198,7 +1201,7 @@ void QSpdyProtocolHandler::handleDataFrame(const QByteArray &frameHeaders)
         m_waitingForCompleteStream = false;
     }
 
-    HttpMessagePair pair = m_inFlightStreams.value(streamID);
+    HttpMessagePair pair = it.value();
     QHttpNetworkRequest httpRequest = pair.first;
     QHttpNetworkReply *httpReply = pair.second;
     Q_ASSERT(httpReply != 0);
diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp
index 3101a981657..232875f43c7 100644
--- a/src/network/bearer/qnetworkconfigmanager_p.cpp
+++ b/src/network/bearer/qnetworkconfigmanager_p.cpp
@@ -52,6 +52,8 @@
 #include <QtCore/qbytearray.h>
 #include <QtCore/qglobal.h>
 
+#include <utility>
+
 
 #ifndef QT_NO_BEARERMANAGEMENT
 
@@ -263,17 +265,18 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIden
 
     foreach (QBearerEngine *engine, sessionEngines) {
         QMutexLocker locker(&engine->mutex);
-
-        if (engine->accessPointConfigurations.contains(identifier))
-            item.d = engine->accessPointConfigurations[identifier];
-        else if (engine->snapConfigurations.contains(identifier))
-            item.d = engine->snapConfigurations[identifier];
-        else if (engine->userChoiceConfigurations.contains(identifier))
-            item.d = engine->userChoiceConfigurations[identifier];
-        else
-            continue;
-
-        return item;
+        if (auto ptr = engine->accessPointConfigurations.value(identifier)) {
+            item.d = std::move(ptr);
+            break;
+        }
+        if (auto ptr = engine->snapConfigurations.value(identifier)) {
+            item.d = std::move(ptr);
+            break;
+        }
+        if (auto ptr = engine->userChoiceConfigurations.value(identifier)) {
+            item.d = std::move(ptr);
+            break;
+        }
     }
 
     return item;
diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
index e04c8cc953d..fc01acb8b4a 100644
--- a/src/network/bearer/qsharednetworksession.cpp
+++ b/src/network/bearer/qsharednetworksession.cpp
@@ -65,9 +65,10 @@ static void doDeleteLater(QObject* obj)
 QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(const QNetworkConfiguration &config)
 {
     QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
+    const auto it = m->sessions.constFind(config);
     //if already have a session, return it
-    if (m->sessions.contains(config)) {
-        QSharedPointer<QNetworkSession> p = m->sessions.value(config).toStrongRef();
+    if (it != m->sessions.cend()) {
+        QSharedPointer<QNetworkSession> p = it.value().toStrongRef();
         if (!p.isNull())
             return p;
     }
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index ee50008cc7f..4de4c1799f4 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -370,9 +370,11 @@ bool QSocks5BindStore::contains(qintptr socketDescriptor)
 QSocks5BindData *QSocks5BindStore::retrieve(qintptr socketDescriptor)
 {
     QMutexLocker lock(&mutex);
-    if (!store.contains(socketDescriptor))
+    const auto it = store.constFind(socketDescriptor);
+    if (it == store.cend())
         return 0;
-    QSocks5BindData *bindData = store.take(socketDescriptor);
+    QSocks5BindData *bindData = it.value();
+    store.erase(it);
     if (bindData) {
         if (bindData->controlSocket->thread() != QThread::currentThread()) {
             qWarning("Can not access socks5 bind data from different thread");
diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp
index b1ec1d06e20..96ba68089dc 100644
--- a/src/network/ssl/qsslcertificate.cpp
+++ b/src/network/ssl/qsslcertificate.cpp
@@ -482,8 +482,9 @@ QList<QSslCertificate> QSslCertificate::fromPath(const QString &path,
     if (pos != -1) {
         // there was a special char in the path so cut of the part containing that char.
         pathPrefix = pathPrefix.left(pos);
-        if (pathPrefix.contains(QLatin1Char('/')))
-            pathPrefix = pathPrefix.left(pathPrefix.lastIndexOf(QLatin1Char('/')));
+        const int lastIndexOfSlash = pathPrefix.lastIndexOf(QLatin1Char('/'));
+        if (lastIndexOfSlash != -1)
+            pathPrefix = pathPrefix.left(lastIndexOfSlash);
         else
             pathPrefix.clear();
     } else {
-- 
GitLab