summaryrefslogtreecommitdiffstats
path: root/src/network/kernel
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2014-12-24 12:28:38 -0200
committerThiago Macieira <thiago.macieira@intel.com>2015-01-09 18:16:13 +0100
commit05d39ec9c0428696d3d523e6b024df59d456fc59 (patch)
tree36f01cc60b409b6cb542ef2e8b3831a1ed327435 /src/network/kernel
parent8761b2b5d9f36395a52608ec853047fc6052e600 (diff)
Optimize QHostAddress::operator== for SpecialAddress
There's no need to allocate memory for the special address. Change-Id: I5f3760565807731ab595e91fc934c21d10df212a Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/network/kernel')
-rw-r--r--src/network/kernel/qhostaddress.cpp36
1 files changed, 26 insertions, 10 deletions
diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp
index 10fdf2f97d..b68f6adfff 100644
--- a/src/network/kernel/qhostaddress.cpp
+++ b/src/network/kernel/qhostaddress.cpp
@@ -778,18 +778,34 @@ bool QHostAddress::operator==(const QHostAddress &other) const
bool QHostAddress::operator ==(SpecialAddress other) const
{
QT_ENSURE_PARSED(this);
- QHostAddress otherAddress(other);
- QT_ENSURE_PARSED(&otherAddress);
+ switch (other) {
+ case Null:
+ return d->protocol == QAbstractSocket::UnknownNetworkLayerProtocol;
- if (d->protocol == QAbstractSocket::IPv4Protocol)
- return otherAddress.d->protocol == QAbstractSocket::IPv4Protocol && d->a == otherAddress.d->a;
- if (d->protocol == QAbstractSocket::IPv6Protocol) {
- return otherAddress.d->protocol == QAbstractSocket::IPv6Protocol
- && memcmp(&d->a6, &otherAddress.d->a6, sizeof(Q_IPV6ADDR)) == 0;
+ case Broadcast:
+ return d->protocol == QAbstractSocket::IPv4Protocol && d->a == INADDR_BROADCAST;
+
+ case LocalHost:
+ return d->protocol == QAbstractSocket::IPv4Protocol && d->a == INADDR_LOOPBACK;
+
+ case Any:
+ return d->protocol == QAbstractSocket::AnyIPProtocol;
+
+ case AnyIPv4:
+ return d->protocol == QAbstractSocket::IPv4Protocol && d->a == INADDR_ANY;
+
+ case LocalHostIPv6:
+ case AnyIPv6:
+ if (d->protocol == QAbstractSocket::IPv6Protocol) {
+ Q_IPV6ADDR ip6 = { { 0 } };
+ ip6[15] = quint8(other == LocalHostIPv6); // 1 for localhost, 0 for any
+ return memcmp(&d->a6, &ip6, sizeof ip6) == 0;
+ }
+ return false;
}
- if (d->protocol == QAbstractSocket::AnyIPProtocol)
- return other == QHostAddress::Any;
- return int(other) == int(Null);
+
+ Q_UNREACHABLE();
+ return false;
}
/*!