From 0f932b9a5de21060fb9763eed24298ae929e9821 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 17 Nov 2022 20:37:15 -0800 Subject: QUuid: add a trivial structure to support exactly 128 bits This is inspired by QBluetoothUuid's quint128, but with a better name. It also matches systemd's sd_id128. Change-Id: Id8e48e8f498c4a029619fffd172893dc1545adda Reviewed-by: Ivan Solovev --- src/corelib/plugin/quuid.h | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/corelib/plugin/quuid.h') diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index bcd78d85e7..21833efe03 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -4,6 +4,7 @@ #ifndef QUUID_H #define QUUID_H +#include #include #if defined(Q_OS_WIN) || defined(Q_QDOC) @@ -26,7 +27,6 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSUUID); QT_BEGIN_NAMESPACE - class Q_CORE_EXPORT QUuid { QUuid(Qt::Initialization) {} @@ -55,11 +55,24 @@ public: Id128 = 3 }; + union Id128Bytes { + quint8 data[16]; + quint16 data16[8]; + quint32 data32[4]; + quint64 data64[2]; + + constexpr explicit operator QByteArrayView() const noexcept + { + return QByteArrayView(data, sizeof(data)); + } + }; + constexpr QUuid() noexcept {} 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; explicit QUuid(QAnyStringView string) noexcept : QUuid{fromString(string)} {} @@ -73,11 +86,15 @@ public: #endif QString toString(StringFormat mode = WithBraces) const; QByteArray toByteArray(StringFormat mode = WithBraces) const; + Id128Bytes toBytes() const noexcept; QByteArray toRfc4122() const; + + static QUuid fromBytes(const void *bytes) noexcept; #if QT_CORE_REMOVED_SINCE(6, 3) static QUuid fromRfc4122(const QByteArray &); #endif static QUuid fromRfc4122(QByteArrayView) noexcept; + bool isNull() const noexcept; constexpr bool operator==(const QUuid &orig) const noexcept @@ -177,6 +194,31 @@ 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 +{ + data1 = qFromBigEndian(&uuid.data[0]); + data2 = qFromBigEndian(&uuid.data[4]); + data3 = qFromBigEndian(&uuid.data[6]); + memcpy(data4, &uuid.data[8], sizeof(data4)); +} + +inline QUuid::Id128Bytes QUuid::toBytes() 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)); + return result; +} + +inline QUuid QUuid::fromBytes(const void *bytes) noexcept +{ + Id128Bytes result = {}; + memcpy(result.data, bytes, sizeof(result)); + return QUuid(result); +} + inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept { return !(rhs < lhs); } inline bool operator>=(const QUuid &lhs, const QUuid &rhs) noexcept -- cgit v1.2.3