summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/quuid.h
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2022-11-17 20:37:15 -0800
committerIvan Solovev <ivan.solovev@qt.io>2022-12-16 19:29:09 +0100
commit0f932b9a5de21060fb9763eed24298ae929e9821 (patch)
tree9133d101c456ef8af891de99b960c1d649eff260 /src/corelib/plugin/quuid.h
parentc3c5d2cab07ffed1ddfb7978870c05917d89fa39 (diff)
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 <ivan.solovev@qt.io>
Diffstat (limited to 'src/corelib/plugin/quuid.h')
-rw-r--r--src/corelib/plugin/quuid.h44
1 files changed, 43 insertions, 1 deletions
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 <QtCore/qendian.h>
#include <QtCore/qstring.h>
#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<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
+{
+ 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