summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/quuid.h
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-07-13 16:30:34 +0200
committerIvan Solovev <ivan.solovev@qt.io>2023-07-17 18:49:16 +0200
commit0393fa6bf244c1135a9ed20cba8649687da45b9b (patch)
tree36d9e363a63fe373ff56e5dd098d75b37dfd14a2 /src/corelib/plugin/quuid.h
parentef4e36aa3c816d9d8d07db412e72821a75de4e40 (diff)
QUuid: handle quint128 and Id128Bytes data in the same way
The QUuid(quint128) ctor was handing the incoming data differently from the QUuid(Id128Bytes) ctor. Same was valid for the return values of QUuid::toUint128() vs QUuid::toBytes(). The provided test didn't reveal it, because it was treating the same 128-bit input value as BE in one place, and as LE in another place. This patch fixes the test, and updates the implementation of QUuid(quint128) ctor and toUInt128() method to verify that the updated test passes. This commit amends 8566c2db85a6f579a1a0432d0b7621633158e04c Pick-to: 6.6 Change-Id: I24edb8ba0c8f7fd15062ba0b2a94ad387c3e98b6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/plugin/quuid.h')
-rw-r--r--src/corelib/plugin/quuid.h44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index b8bb5bd95a..299ce76d7b 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -246,26 +246,40 @@ inline QUuid QUuid::fromBytes(const void *bytes, QSysInfo::Endian order) noexcep
constexpr QUuid::QUuid(quint128 uuid, QSysInfo::Endian order) noexcept
: QUuid()
{
- if (order == QSysInfo::LittleEndian)
- uuid = qbswap(uuid);
- data1 = uint(uuid >> 96);
- data2 = ushort(uuid >> 80);
- data3 = ushort(uuid >> 64);
- for (int i = 0; i < 8; ++i)
- data4[i] = uchar(uuid >> (56 - i * 8));
+ if (order == QSysInfo::BigEndian) {
+ data1 = qFromBigEndian<quint32>(int(uuid));
+ data2 = qFromBigEndian<quint16>(ushort(uuid >> 32));
+ data3 = qFromBigEndian<quint16>(ushort(uuid >> 48));
+ for (int i = 0; i < 8; ++i)
+ data4[i] = uchar(uuid >> (64 + i * 8));
+ } else {
+ data1 = qFromLittleEndian<quint32>(uint(uuid >> 96));
+ data2 = qFromLittleEndian<quint16>(ushort(uuid >> 80));
+ data3 = qFromLittleEndian<quint16>(ushort(uuid >> 64));
+ for (int i = 0; i < 8; ++i)
+ data4[i] = uchar(uuid >> (56 - i * 8));
+ }
}
constexpr quint128 QUuid::toUInt128(QSysInfo::Endian order) const noexcept
{
quint128 result = {};
- result = data1;
- result <<= 32;
- result |= (data2 << 16) | uint(data3);
- result <<= 64;
- for (int i = 0; i < 8; ++i)
- result |= quint64(data4[i]) << (56 - i * 8);
- if (order == QSysInfo::LittleEndian)
- return qbswap(result);
+ if (order == QSysInfo::BigEndian) {
+ for (int i = 0; i < 8; ++i)
+ result |= quint64(data4[i]) << (i * 8);
+ result = result << 64;
+ result |= quint64(qToBigEndian<quint16>(data3)) << 48;
+ result |= quint64(qToBigEndian<quint16>(data2)) << 32;
+ result |= qToBigEndian<quint32>(data1);
+ } else {
+ result = qToLittleEndian<quint32>(data1);
+ result = result << 32;
+ result |= quint64(qToLittleEndian<quint16>(data2)) << 16;
+ result |= quint64(qToLittleEndian<quint16>(data3));
+ result = result << 64;
+ for (int i = 0; i < 8; ++i)
+ result |= quint64(data4[i]) << (56 - i * 8);
+ }
return result;
}
#endif