8#include <QtCore/qcompare.h>
9#include <QtCore/qendian.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qsystemdetection.h>
13#if defined(Q_OS_WIN) || defined(Q_QDOC)
26#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
35 QUuid(Qt::Initialization) {}
67#if defined(QT_COMPILER_SUPPORTS_INT128)
72#elif defined(QT_SUPPORTS_INT128)
73# error "struct QUuid::Id128Bytes should not depend on QT_SUPPORTS_INT128 for ABI reasons."
74# error "Adjust the declaration of the `data128` member above so it is always defined if it's "
75 "supported by the current compiler/architecture in any configuration."
94 constexpr QUuid()
noexcept : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {}
96 constexpr QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3,
97 uchar b4, uchar b5, uchar b6, uchar b7, uchar b8)
noexcept
98 : data1(l), data2(w1), data3(w2), data4{b1, b2, b3, b4, b5, b6, b7, b8} {}
99 explicit inline QUuid(Id128Bytes id128, QSysInfo::Endian order = QSysInfo::BigEndian)
noexcept;
101 explicit QUuid(QAnyStringView string)
noexcept
102 : QUuid{fromString(string)} {}
103 static QUuid
fromString(QAnyStringView string)
noexcept;
104#if QT_CORE_REMOVED_SINCE(6
, 3
)
105 explicit QUuid(
const QString &);
106 static QUuid fromString(QStringView string)
noexcept;
107 static QUuid fromString(QLatin1StringView string)
noexcept;
108 explicit QUuid(
const char *);
109 explicit QUuid(
const QByteArray &);
117#if QT_CORE_REMOVED_SINCE(6
, 3
)
118 static QUuid fromRfc4122(
const QByteArray &);
122#if QT_CORE_REMOVED_SINCE(6
, 9
)
123 bool isNull()
const noexcept;
127#if defined(__cpp_lib_bit_cast) && defined(QT_SUPPORTS_INT128)
128 return std::bit_cast<quint128>(*
this) == 0;
134 for (size_t i = 0; i < 8; ++i) {
138 return data1 == 0 && data2 == 0 && data3 == 0;
142#ifdef QT_SUPPORTS_INT128
143 static constexpr QUuid fromUInt128(quint128 uuid, QSysInfo::Endian order = QSysInfo::BigEndian)
noexcept;
144 constexpr quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian)
const noexcept;
148 friend constexpr bool comparesEqual(
const QUuid &lhs,
const QUuid &rhs)
noexcept
150 return is_eq(compareThreeWay_helper(lhs, rhs));
152 static constexpr Qt::strong_ordering
153 compareThreeWay_helper(
const QUuid &lhs,
const QUuid &rhs)
noexcept
155#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
156 if (
const auto c = Qt::compareThreeWay(lhs.data1, rhs.data1); !is_eq(c))
158 if (
const auto c = Qt::compareThreeWay(lhs.data2, rhs.data2); !is_eq(c))
160 if (
const auto c = Qt::compareThreeWay(lhs.data3, rhs.data3); !is_eq(c))
162#elif defined(__cpp_lib_bit_cast) && defined(QT_SUPPORTS_INT128)
163 quint128 lu = qFromBigEndian(std::bit_cast<quint128>(lhs));
164 quint128 ru = qFromBigEndian(std::bit_cast<quint128>(rhs));
165 return Qt::compareThreeWay(lu, ru);
167 auto make_int = [](
const QUuid &u) {
168 quint64 result = quint64(u.data3) << 48;
169 result |= quint64(u.data2) << 32;
170 return qFromBigEndian(result | u.data1);
172 if (
const auto c = Qt::compareThreeWay(make_int(lhs), make_int(rhs)); !is_eq(c))
175 for (
unsigned i = 0; i <
sizeof(lhs.data4); ++i) {
176 if (
const auto c = Qt::compareThreeWay(lhs.data4[i], rhs.data4[i]); !is_eq(c))
179 return Qt::strong_ordering::equal;
183#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
186 auto fastVariant = [](
const QUuid &uuid) {
187 quint8 v = uuid.data4[0];
189 return v >= 0xC0 ? v & 0xE0 : v >= 0x80 ? 0x80 : 0;
191 if (
const auto c = Qt::compareThreeWay(fastVariant(lhs), fastVariant(rhs)); !is_eq(c))
194 return compareThreeWay_helper(lhs, rhs);
199
200#if QT_CORE_REMOVED_SINCE(6
, 8
)
201 constexpr bool operator==(
const QUuid &orig)
const noexcept
203 return comparesEqual(*
this, orig);
206 constexpr bool operator!=(
const QUuid &orig)
const noexcept
208 return !operator==(orig);
211 bool operator<(
const QUuid &other)
const noexcept;
212 bool operator>(
const QUuid &other)
const noexcept;
214 Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QUuid)
216#if defined(Q_OS_WIN) || defined(Q_QDOC)
219 constexpr QUuid(
const GUID &guid)
noexcept
220 : data1(guid.Data1), data2(guid.Data2), data3(guid.Data3),
221 data4{guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
222 guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]} {}
224 constexpr QUuid &operator=(
const GUID &guid)
noexcept
230 constexpr operator GUID()
const noexcept
232 GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } };
236 friend constexpr bool comparesEqual(
const QUuid &lhs,
const GUID &rhs)
noexcept
238 return comparesEqual(lhs, QUuid(rhs));
242
243#if QT_CORE_REMOVED_SINCE(6
, 8
)
244 constexpr bool operator==(
const GUID &guid)
const noexcept
246 return comparesEqual(*
this, QUuid(guid));
249 constexpr bool operator!=(
const GUID &guid)
const noexcept
251 return !operator==(guid);
254 Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QUuid, GUID)
258 static QUuid createUuid();
259#if QT_CORE_REMOVED_SINCE(6
, 8
)
260 static QUuid createUuidV3(
const QUuid &ns,
const QByteArray &baseData)
noexcept;
261 static QUuid createUuidV5(
const QUuid &ns,
const QByteArray &baseData)
noexcept;
263 static QUuid
createUuidV5(QUuid ns, QByteArrayView baseData)
noexcept;
264#ifndef QT_BOOTSTRAPPED
265 static QUuid
createUuidV3(QUuid ns, QByteArrayView baseData)
noexcept;
266#if !QT_CORE_REMOVED_SINCE(6
, 8
)
269 static inline QUuid
createUuidV3(
const QUuid &ns,
const QString &baseData)
271 return QUuid::createUuidV3(ns, qToByteArrayViewIgnoringNull(baseData.toUtf8()));
274#if !QT_CORE_REMOVED_SINCE(6
, 8
)
277 static inline QUuid
createUuidV5(
const QUuid &ns,
const QString &baseData)
279 return QUuid::createUuidV5(ns, qToByteArrayViewIgnoringNull(baseData.toUtf8()));
285 static constexpr bool isKnownVersion(Version v)
noexcept
302#if QT_CORE_REMOVED_SINCE(6
, 9
)
303 QUuid::Variant variant()
const noexcept;
304 QUuid::Version version()
const noexcept;
306 constexpr Variant variant(QT6_DECL_NEW_OVERLOAD)
const noexcept
309 const quint8 var = data4[0] & 0xE0;
311 return isNull(QT6_CALL_NEW_OVERLOAD) ? VarUnknown : NCS;
314 return Variant(var >> 5);
319 const Version ver = Version(data3 >> 12);
321 if (isKnownVersion(ver) && (data4[0] & 0xC0) == 0x80)
326#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
327 static QUuid fromCFUUID(CFUUIDRef uuid);
328 CFUUIDRef toCFUUID()
const Q_DECL_CF_RETURNS_RETAINED;
329 static QUuid fromNSUUID(
const NSUUID *uuid);
330 NSUUID *toNSUUID()
const Q_DECL_NS_RETURNS_AUTORELEASED;
341#ifndef QT_NO_DATASTREAM
342Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &,
const QUuid &);
346#ifndef QT_NO_DEBUG_STREAM
347Q_CORE_EXPORT
QDebug operator<<(QDebug,
const QUuid &);
350Q_CORE_EXPORT size_t qHash(
const QUuid &uuid, size_t seed = 0)
noexcept;
352QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order)
noexcept
354 char bytes[
sizeof uuid];
355 if (order == QSysInfo::LittleEndian)
358 memcpy(bytes, &uuid,
sizeof bytes);
359 data1 = qFromBigEndian<quint32>(&bytes[0]);
360 data2 = qFromBigEndian<quint16>(&bytes[4]);
361 data3 = qFromBigEndian<quint16>(&bytes[6]);
362 memcpy(data4, &bytes[8],
sizeof(data4));
365QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order)
const noexcept
367 Id128Bytes result = {};
368 qToBigEndian(data1, &result.data[0]);
369 qToBigEndian(data2, &result.data[4]);
370 qToBigEndian(data3, &result.data[6]);
371 memcpy(&result.data[8], data4,
sizeof(data4));
372 if (order == QSysInfo::LittleEndian)
373 return qbswap(result);
377QUuid QUuid::fromBytes(
const void *bytes, QSysInfo::Endian order)
379 Id128Bytes result = {};
380 memcpy(result.data, bytes,
sizeof(result));
381 return QUuid(result, order);
384#ifdef QT_SUPPORTS_INT128
385constexpr QUuid QUuid::fromUInt128(quint128 uuid, QSysInfo::Endian order)
noexcept
388 if (order == QSysInfo::BigEndian) {
389 result.data1 = qFromBigEndian<quint32>(
int(uuid));
390 result.data2 = qFromBigEndian<quint16>(ushort(uuid >> 32));
391 result.data3 = qFromBigEndian<quint16>(ushort(uuid >> 48));
392 for (
int i = 0; i < 8; ++i)
393 result.data4[i] = uchar(uuid >> (64 + i * 8));
395 result.data1 = qFromLittleEndian<quint32>(uint(uuid >> 96));
396 result.data2 = qFromLittleEndian<quint16>(ushort(uuid >> 80));
397 result.data3 = qFromLittleEndian<quint16>(ushort(uuid >> 64));
398 for (
int i = 0; i < 8; ++i)
399 result.data4[i] = uchar(uuid >> (56 - i * 8));
404constexpr quint128 QUuid::toUInt128(QSysInfo::Endian order)
const noexcept
406 quint128 result = {};
407 if (order == QSysInfo::BigEndian) {
408 for (
int i = 0; i < 8; ++i)
409 result |= quint64(data4[i]) << (i * 8);
410 result = result << 64;
411 result |= quint64(qToBigEndian<quint16>(data3)) << 48;
412 result |= quint64(qToBigEndian<quint16>(data2)) << 32;
413 result |= qToBigEndian<quint32>(data1);
415 result = qToLittleEndian<quint32>(data1);
416 result = result << 32;
417 result |= quint64(qToLittleEndian<quint16>(data2)) << 16;
418 result |= quint64(qToLittleEndian<quint16>(data3));
419 result = result << 64;
420 for (
int i = 0; i < 8; ++i)
421 result |= quint64(data4[i]) << (56 - i * 8);
430QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src);
431QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src);
432QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src);
433QUuid::Id128Bytes qToLittleEndian(QUuid::Id128Bytes src);
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
QCborArray toArray(const QCborArray &a) const
QCborMap toMap(const QCborMap &m) const
QVariant toVariant() const
QCborValueConstRef & operator=(const QCborValueConstRef &)=delete
QCborArray toArray() const
bool toBool(bool defaultValue=false) const
QCborValue taggedValue(const QCborValue &defaultValue=QCborValue()) const
QCborSimpleType toSimpleType(QCborSimpleType defaultValue=QCborSimpleType::Undefined) const
bool isSimpleType() const
bool isRegularExpression() const
QCborValue::Type type() const
QCborValueConstRef(const QCborValueConstRef &)=default
QCborTag tag(QCborTag defaultValue=QCborTag(-1)) const
constexpr QCborValueConstRef()
QByteArray toByteArray(const QByteArray &defaultValue={}) const
qint64 toInteger(qint64 defaultValue=0) const
bool isSimpleType(QCborSimpleType st) const
QUuid toUuid(const QUuid &defaultValue={}) const
QCborContainerPrivate * d
QAnyStringView toStringView(QAnyStringView defaultValue={}) const
friend bool comparesEqual(const QCborValueConstRef &lhs, const QCborValueConstRef &rhs) noexcept
friend bool comparesEqual(const QCborValueConstRef &lhs, const QCborValue &rhs) noexcept
QString toDiagnosticNotation(QCborValue::DiagnosticNotationOptions opt=QCborValue::Compact) const
int compare(const QCborValue &other) const
friend Qt::strong_ordering compareThreeWay(const QCborValueConstRef &lhs, const QCborValue &rhs) noexcept
operator QCborValue() const
friend Qt::strong_ordering compareThreeWay(const QCborValueConstRef &lhs, const QCborValueConstRef &rhs) noexcept
constexpr QCborValueConstRef(QCborContainerPrivate *dd, qsizetype ii)
QCborValue concrete() const noexcept
QString toString(const QString &defaultValue={}) const
QUrl toUrl(const QUrl &defaultValue={}) const
QJsonValue toJsonValue() const
double toDouble(double defaultValue=0) const
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
friend bool comparesEqual(const QJsonValueConstRef &lhs, const QJsonValue &rhs)
constexpr QJsonValueConstRef(QCborContainerPrivate *d, size_t index, bool is_object)
friend bool comparesEqual(const QJsonValueConstRef &lhs, const QJsonValueConstRef &rhs)
operator QJsonValue() const
QAnyStringView objectKeyView() const
void rebind(QJsonValueConstRef other)
QString objectKey() const
QAnyStringView toStringView(QAnyStringView defaultValue={}) const
QJsonValueConstRef(const QJsonValueConstRef &)=default
qint64 toInteger(qint64 defaultValue=0) const
bool toBool(bool defaultValue=false) const
QJsonValueConstRef & operator=(const QJsonValueConstRef &)=delete
QString toString(const QString &defaultValue={}) const
QJsonValue::Type type() const
QJsonValueConstRef(QJsonArray *array, qsizetype idx)
QCborContainerPrivate * d
QJsonValueConstRef(QJsonObject *object, qsizetype idx)
double toDouble(double defaultValue=0) const
int toInt(int defaultValue=0) const
const QJsonValue operator[](QStringView key) const
\inmodule QtCore\reentrant
\inmodule QtCore\compares equality \compareswith equality QLine \endcompareswith
\inmodule QtCore\compares equality \compareswith equality QLineF \endcompareswith
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
friend constexpr Qt::strong_ordering compareThreeWay(const QUuid &lhs, const QUuid &rhs) noexcept
Version
This enum defines the values used in the \l{Version field} {version field} of the UUID.
static QUuid fromBytes(const void *bytes, QSysInfo::Endian order=QSysInfo::BigEndian)
static QUuid createUuidV7()
QString toString(StringFormat mode=WithBraces) const
constexpr Version version(QT6_DECL_NEW_OVERLOAD) const noexcept
Returns the \l{Version field} {version field} of the UUID, if the UUID's \l{Variant field}...
static Q_WEAK_OVERLOAD QUuid createUuidV5(const QUuid &ns, const QString &baseData)
Id128Bytes toBytes(QSysInfo::Endian order=QSysInfo::BigEndian) const noexcept
static QUuid fromRfc4122(QByteArrayView) noexcept
Creates a QUuid object from the binary representation of the UUID, as specified by RFC 4122 section 4...
QByteArray toByteArray(StringFormat mode=WithBraces) const
static QUuid fromString(QAnyStringView string) noexcept
constexpr bool isNull(QT6_DECL_NEW_OVERLOAD) const noexcept
Returns true if this is the null UUID {00000000-0000-0000-0000-000000000000}; otherwise returns false...
static Q_WEAK_OVERLOAD QUuid createUuidV3(const QUuid &ns, const QString &baseData)
QByteArray toRfc4122() const
Returns the binary representation of this QUuid.
static QUuid createUuidV3(QUuid ns, QByteArrayView baseData) noexcept
static QUuid createUuidV5(QUuid ns, QByteArrayView baseData) noexcept
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Combined button and popup list for selecting options.
QVariant sequentialIteratorToVariant(const Indirect &referred)
QVariant associativeIteratorToVariant(const Indirect &referred)
QMutableListIterator< QByteArray > QMutableByteArrayListIterator
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
QList< QVariant > QVariantList
Q_DECLARE_TYPEINFO(QLine, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QLineF, Q_PRIMITIVE_TYPE)
#define qCWarning(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
#define QStringLiteral(str)
Q_DECLARE_TYPEINFO(QUuid, Q_PRIMITIVE_TYPE)
\inmodule QtCore\reentrant
QString errorString() const
\variable QCborParserError::offset
~QListSpecialMethods()=default
QListSpecialMethods & operator=(const QListSpecialMethods &)=default
QListSpecialMethods(QListSpecialMethods &&)=default
QListSpecialMethods & operator=(QListSpecialMethods &&)=default
QListSpecialMethods()=default
QListSpecialMethods(const QListSpecialMethods &)=default
QByteArray join(QByteArrayView sep={}) const
static T value(const Iterator &it)
static T value(Iterator &it)
static QCborValueConstRef key(Iterator &it)
static QCborValueConstRef key(const Iterator &it)
static QAnyStringView key(Iterator &it)
static T value(const Iterator &it)
static QAnyStringView key(const Iterator &it)
static T value(Iterator &it)