7#include <QtCore/qcompare.h>
8#include <QtCore/qendian.h>
9#include <QtCore/qstring.h>
10#include <QtCore/qsystemdetection.h>
12#if defined(Q_OS_WIN) || defined(Q_QDOC)
25#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
34 QUuid(Qt::Initialization) {}
66#if defined(QT_COMPILER_SUPPORTS_INT128)
71#elif defined(QT_SUPPORTS_INT128)
72# error "struct QUuid::Id128Bytes should not depend on QT_SUPPORTS_INT128 for ABI reasons."
73# error "Adjust the declaration of the `data128` member above so it is always defined if it's "
74 "supported by the current compiler/architecture in any configuration."
93 constexpr QUuid()
noexcept : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {}
95 constexpr QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3,
96 uchar b4, uchar b5, uchar b6, uchar b7, uchar b8)
noexcept
97 : data1(l), data2(w1), data3(w2), data4{b1, b2, b3, b4, b5, b6, b7, b8} {}
98 explicit inline QUuid(Id128Bytes id128, QSysInfo::Endian order = QSysInfo::BigEndian)
noexcept;
100 explicit QUuid(QAnyStringView string)
noexcept
101 : QUuid{fromString(string)} {}
102 static QUuid
fromString(QAnyStringView string)
noexcept;
103#if QT_CORE_REMOVED_SINCE(6
, 3
)
104 explicit QUuid(
const QString &);
105 static QUuid fromString(QStringView string)
noexcept;
106 static QUuid fromString(QLatin1StringView string)
noexcept;
107 explicit QUuid(
const char *);
108 explicit QUuid(
const QByteArray &);
116#if QT_CORE_REMOVED_SINCE(6
, 3
)
117 static QUuid fromRfc4122(
const QByteArray &);
121#if QT_CORE_REMOVED_SINCE(6
, 9
)
122 bool isNull()
const noexcept;
126#if defined(__cpp_lib_bit_cast) && defined(QT_SUPPORTS_INT128)
127 return std::bit_cast<quint128>(*
this) == 0;
133 for (size_t i = 0; i < 8; ++i) {
137 return data1 == 0 && data2 == 0 && data3 == 0;
141#ifdef QT_SUPPORTS_INT128
142 static constexpr QUuid fromUInt128(quint128 uuid, QSysInfo::Endian order = QSysInfo::BigEndian)
noexcept;
143 constexpr quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian)
const noexcept;
147 friend constexpr bool comparesEqual(
const QUuid &lhs,
const QUuid &rhs)
noexcept
149 return is_eq(compareThreeWay_helper(lhs, rhs));
151 static constexpr Qt::strong_ordering
152 compareThreeWay_helper(
const QUuid &lhs,
const QUuid &rhs)
noexcept
154#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
155 if (
const auto c = Qt::compareThreeWay(lhs.data1, rhs.data1); !is_eq(c))
157 if (
const auto c = Qt::compareThreeWay(lhs.data2, rhs.data2); !is_eq(c))
159 if (
const auto c = Qt::compareThreeWay(lhs.data3, rhs.data3); !is_eq(c))
161#elif defined(__cpp_lib_bit_cast) && defined(QT_SUPPORTS_INT128)
162 quint128 lu = qFromBigEndian(std::bit_cast<quint128>(lhs));
163 quint128 ru = qFromBigEndian(std::bit_cast<quint128>(rhs));
164 return Qt::compareThreeWay(lu, ru);
166 auto make_int = [](
const QUuid &u) {
167 quint64 result = quint64(u.data3) << 48;
168 result |= quint64(u.data2) << 32;
169 return qFromBigEndian(result | u.data1);
171 if (
const auto c = Qt::compareThreeWay(make_int(lhs), make_int(rhs)); !is_eq(c))
174 for (
unsigned i = 0; i <
sizeof(lhs.data4); ++i) {
175 if (
const auto c = Qt::compareThreeWay(lhs.data4[i], rhs.data4[i]); !is_eq(c))
178 return Qt::strong_ordering::equal;
182#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
185 auto fastVariant = [](
const QUuid &uuid) {
186 quint8 v = uuid.data4[0];
188 return v >= 0xC0 ? v & 0xE0 : v >= 0x80 ? 0x80 : 0;
190 if (
const auto c = Qt::compareThreeWay(fastVariant(lhs), fastVariant(rhs)); !is_eq(c))
193 return compareThreeWay_helper(lhs, rhs);
198
199#if QT_CORE_REMOVED_SINCE(6
, 8
)
200 constexpr bool operator==(
const QUuid &orig)
const noexcept
202 return comparesEqual(*
this, orig);
205 constexpr bool operator!=(
const QUuid &orig)
const noexcept
207 return !operator==(orig);
210 bool operator<(
const QUuid &other)
const noexcept;
211 bool operator>(
const QUuid &other)
const noexcept;
213 Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QUuid)
215#if defined(Q_OS_WIN) || defined(Q_QDOC)
218 constexpr QUuid(
const GUID &guid)
noexcept
219 : data1(guid.Data1), data2(guid.Data2), data3(guid.Data3),
220 data4{guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
221 guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]} {}
223 constexpr QUuid &operator=(
const GUID &guid)
noexcept
229 constexpr operator GUID()
const noexcept
231 GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } };
235 friend constexpr bool comparesEqual(
const QUuid &lhs,
const GUID &rhs)
noexcept
237 return comparesEqual(lhs, QUuid(rhs));
241
242#if QT_CORE_REMOVED_SINCE(6
, 8
)
243 constexpr bool operator==(
const GUID &guid)
const noexcept
245 return comparesEqual(*
this, QUuid(guid));
248 constexpr bool operator!=(
const GUID &guid)
const noexcept
250 return !operator==(guid);
253 Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QUuid, GUID)
257 static QUuid createUuid();
258#if QT_CORE_REMOVED_SINCE(6
, 8
)
259 static QUuid createUuidV3(
const QUuid &ns,
const QByteArray &baseData)
noexcept;
260 static QUuid createUuidV5(
const QUuid &ns,
const QByteArray &baseData)
noexcept;
262 static QUuid
createUuidV5(QUuid ns, QByteArrayView baseData)
noexcept;
263#ifndef QT_BOOTSTRAPPED
264 static QUuid
createUuidV3(QUuid ns, QByteArrayView baseData)
noexcept;
265#if !QT_CORE_REMOVED_SINCE(6
, 8
)
268 static inline QUuid
createUuidV3(
const QUuid &ns,
const QString &baseData)
270 return QUuid::createUuidV3(ns, qToByteArrayViewIgnoringNull(baseData.toUtf8()));
273#if !QT_CORE_REMOVED_SINCE(6
, 8
)
276 static inline QUuid
createUuidV5(
const QUuid &ns,
const QString &baseData)
278 return QUuid::createUuidV5(ns, qToByteArrayViewIgnoringNull(baseData.toUtf8()));
284 static constexpr bool isKnownVersion(Version v)
noexcept
301#if QT_CORE_REMOVED_SINCE(6
, 9
)
302 QUuid::Variant variant()
const noexcept;
303 QUuid::Version version()
const noexcept;
305 constexpr Variant variant(QT6_DECL_NEW_OVERLOAD)
const noexcept
308 const quint8 var = data4[0] & 0xE0;
310 return isNull(QT6_CALL_NEW_OVERLOAD) ? VarUnknown : NCS;
313 return Variant(var >> 5);
318 const Version ver = Version(data3 >> 12);
320 if (isKnownVersion(ver) && (data4[0] & 0xC0) == 0x80)
325#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
326 static QUuid fromCFUUID(CFUUIDRef uuid);
327 CFUUIDRef toCFUUID()
const Q_DECL_CF_RETURNS_RETAINED;
328 static QUuid fromNSUUID(
const NSUUID *uuid);
329 NSUUID *toNSUUID()
const Q_DECL_NS_RETURNS_AUTORELEASED;
340#ifndef QT_NO_DATASTREAM
341Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &,
const QUuid &);
345#ifndef QT_NO_DEBUG_STREAM
346Q_CORE_EXPORT
QDebug operator<<(QDebug,
const QUuid &);
349Q_CORE_EXPORT size_t qHash(
const QUuid &uuid, size_t seed = 0)
noexcept;
351QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order)
noexcept
353 char bytes[
sizeof uuid];
354 if (order == QSysInfo::LittleEndian)
357 memcpy(bytes, &uuid,
sizeof bytes);
358 data1 = qFromBigEndian<quint32>(&bytes[0]);
359 data2 = qFromBigEndian<quint16>(&bytes[4]);
360 data3 = qFromBigEndian<quint16>(&bytes[6]);
361 memcpy(data4, &bytes[8],
sizeof(data4));
364QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order)
const noexcept
366 Id128Bytes result = {};
367 qToBigEndian(data1, &result.data[0]);
368 qToBigEndian(data2, &result.data[4]);
369 qToBigEndian(data3, &result.data[6]);
370 memcpy(&result.data[8], data4,
sizeof(data4));
371 if (order == QSysInfo::LittleEndian)
372 return qbswap(result);
376QUuid QUuid::fromBytes(
const void *bytes, QSysInfo::Endian order)
378 Id128Bytes result = {};
379 memcpy(result.data, bytes,
sizeof(result));
380 return QUuid(result, order);
383#ifdef QT_SUPPORTS_INT128
384constexpr QUuid QUuid::fromUInt128(quint128 uuid, QSysInfo::Endian order)
noexcept
387 if (order == QSysInfo::BigEndian) {
388 result.data1 = qFromBigEndian<quint32>(
int(uuid));
389 result.data2 = qFromBigEndian<quint16>(ushort(uuid >> 32));
390 result.data3 = qFromBigEndian<quint16>(ushort(uuid >> 48));
391 for (
int i = 0; i < 8; ++i)
392 result.data4[i] = uchar(uuid >> (64 + i * 8));
394 result.data1 = qFromLittleEndian<quint32>(uint(uuid >> 96));
395 result.data2 = qFromLittleEndian<quint16>(ushort(uuid >> 80));
396 result.data3 = qFromLittleEndian<quint16>(ushort(uuid >> 64));
397 for (
int i = 0; i < 8; ++i)
398 result.data4[i] = uchar(uuid >> (56 - i * 8));
403constexpr quint128 QUuid::toUInt128(QSysInfo::Endian order)
const noexcept
405 quint128 result = {};
406 if (order == QSysInfo::BigEndian) {
407 for (
int i = 0; i < 8; ++i)
408 result |= quint64(data4[i]) << (i * 8);
409 result = result << 64;
410 result |= quint64(qToBigEndian<quint16>(data3)) << 48;
411 result |= quint64(qToBigEndian<quint16>(data2)) << 32;
412 result |= qToBigEndian<quint32>(data1);
414 result = qToLittleEndian<quint32>(data1);
415 result = result << 32;
416 result |= quint64(qToLittleEndian<quint16>(data2)) << 16;
417 result |= quint64(qToLittleEndian<quint16>(data3));
418 result = result << 64;
419 for (
int i = 0; i < 8; ++i)
420 result |= quint64(data4[i]) << (56 - i * 8);
429QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src);
430QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src);
431QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src);
432QUuid::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)