summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-09-06 14:53:15 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-10-06 22:10:31 +0000
commit72d51f1c42b83c26d15cb626f1b22905fbbea474 (patch)
tree454d227555873a4bf91b08b795576f9b67f5174e
parent3321101d8f199f998c9f2b27d997000c38a30454 (diff)
QUuid: de-pessimize QDataStream operator
Use a stack buffer instead of a QByteArray to hold the 16 bytes for the QUuid serialisation, replacing toRfc4122() with toBytes() and a memcpy(). As drive-bys, drop the needless cast from char* to uchar* (qToLittleEndian() has void* arguments, so char* is fine) and drop {} around single-line if body. Pick-to: 6.6 Change-Id: I6ffabcf07fc9a730a782e20e113999a0dcf15067 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
-rw-r--r--src/corelib/plugin/quuid.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 1e263a44e8..63aef7fc67 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -745,13 +745,15 @@ QByteArray QUuid::toRfc4122() const
*/
QDataStream &operator<<(QDataStream &s, const QUuid &id)
{
- QByteArray bytes;
+ constexpr int NumBytes = sizeof(QUuid);
+ static_assert(NumBytes == 16, "Change the serialization format when this ever hits");
+ char bytes[NumBytes];
if (s.byteOrder() == QDataStream::BigEndian) {
- bytes = id.toRfc4122();
+ const auto id128 = id.toBytes();
+ static_assert(sizeof(id128) == NumBytes);
+ memcpy(bytes, &id128, NumBytes);
} else {
- // we know how many bytes a UUID has, I hope :)
- bytes = QByteArray(16, Qt::Uninitialized);
- uchar *data = reinterpret_cast<uchar *>(bytes.data());
+ auto *data = bytes;
// for historical reasons, our little-endian serialization format
// stores each of the UUID fields in little endian, instead of storing
@@ -769,9 +771,9 @@ QDataStream &operator<<(QDataStream &s, const QUuid &id)
}
}
- if (s.writeRawData(bytes.data(), 16) != 16) {
+ if (s.writeRawData(bytes, NumBytes) != NumBytes)
s.setStatus(QDataStream::WriteFailed);
- }
+
return s;
}