diff options
Diffstat (limited to 'src/corelib/plugin/quuid.h')
-rw-r--r-- | src/corelib/plugin/quuid.h | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index 21833efe03..9ba6564ef0 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -72,7 +72,7 @@ public: constexpr QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8) noexcept : data1(l), data2(w1), data3(w2), data4{b1, b2, b3, b4, b5, b6, b7, b8} {} - QUuid(Id128Bytes id128) noexcept; + QUuid(Id128Bytes id128, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept; explicit QUuid(QAnyStringView string) noexcept : QUuid{fromString(string)} {} @@ -86,10 +86,10 @@ public: #endif QString toString(StringFormat mode = WithBraces) const; QByteArray toByteArray(StringFormat mode = WithBraces) const; - Id128Bytes toBytes() const noexcept; + Id128Bytes toBytes(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept; QByteArray toRfc4122() const; - static QUuid fromBytes(const void *bytes) noexcept; + static QUuid fromBytes(const void *bytes, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept; #if QT_CORE_REMOVED_SINCE(6, 3) static QUuid fromRfc4122(const QByteArray &); #endif @@ -179,6 +179,16 @@ public: ushort data2 = 0; ushort data3 = 0; uchar data4[8] = {}; + +private: + static constexpr Id128Bytes bswap(Id128Bytes b) + { + // 128-bit byte swap + b.data64[0] = qbswap(b.data64[0]); + b.data64[1] = qbswap(b.data64[1]); + qSwap(b.data64[0], b.data64[1]); + return b; + } }; Q_DECLARE_TYPEINFO(QUuid, Q_PRIMITIVE_TYPE); @@ -194,29 +204,33 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QUuid &); Q_CORE_EXPORT size_t qHash(const QUuid &uuid, size_t seed = 0) noexcept; -inline QUuid::QUuid(Id128Bytes uuid) noexcept +inline QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order) noexcept { + if (order == QSysInfo::LittleEndian) + uuid = bswap(uuid); data1 = qFromBigEndian<quint32>(&uuid.data[0]); data2 = qFromBigEndian<quint16>(&uuid.data[4]); data3 = qFromBigEndian<quint16>(&uuid.data[6]); memcpy(data4, &uuid.data[8], sizeof(data4)); } -inline QUuid::Id128Bytes QUuid::toBytes() const noexcept +inline QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order) const noexcept { Id128Bytes result = {}; qToBigEndian(data1, &result.data[0]); qToBigEndian(data2, &result.data[4]); qToBigEndian(data3, &result.data[6]); memcpy(&result.data[8], data4, sizeof(data4)); + if (order == QSysInfo::LittleEndian) + return bswap(result); return result; } -inline QUuid QUuid::fromBytes(const void *bytes) noexcept +inline QUuid QUuid::fromBytes(const void *bytes, QSysInfo::Endian order) noexcept { Id128Bytes result = {}; memcpy(result.data, bytes, sizeof(result)); - return QUuid(result); + return QUuid(result, order); } inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept |