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) {}
61 union alignas(16) Id128Bytes {
66#if defined(QT_COMPILER_SUPPORTS_INT128)
68QT_WARNING_DISABLE_GCC(
"-Wpedantic")
69 unsigned __int128 data128[1];
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."
77 constexpr explicit operator QByteArrayView()
const noexcept
79 return QByteArrayView(data,
sizeof(data));
82 friend constexpr Id128Bytes qbswap(Id128Bytes b)
noexcept
85 auto b0 = qbswap(b.data64[0]);
86 auto b1 = qbswap(b.data64[1]);
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 &);
110 QString toString(StringFormat mode = WithBraces)
const;
111 QByteArray toByteArray(StringFormat mode = WithBraces)
const;
112 inline Id128Bytes toBytes(QSysInfo::Endian order = QSysInfo::BigEndian)
const noexcept;
113 QByteArray toRfc4122()
const;
115 static inline QUuid fromBytes(
const void *bytes, QSysInfo::Endian order = QSysInfo::BigEndian);
116#if QT_CORE_REMOVED_SINCE(6
, 3
)
117 static QUuid fromRfc4122(
const QByteArray &);
119 static QUuid fromRfc4122(QByteArrayView)
noexcept;
121#if QT_CORE_REMOVED_SINCE(6
, 9
)
122 bool isNull()
const noexcept;
124 constexpr bool isNull(QT6_DECL_NEW_OVERLOAD)
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;
180 friend constexpr Qt::strong_ordering compareThreeWay(
const QUuid &lhs,
const QUuid &rhs)
noexcept
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()));
281 static QUuid createUuidV7();
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);
315 constexpr Version version(QT6_DECL_NEW_OVERLOAD)
const noexcept
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);
The QAssociativeIterable class is an iterable interface for an associative container in a QVariant.
\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
static Q_CORE_EXPORT double concreteDouble(QCborValueConstRef that, double defaultValue) noexcept Q_DECL_PURE_FUNCTION
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
static Q_CORE_EXPORT bool concreteBoolean(QCborValueConstRef that, bool defaultValue) noexcept Q_DECL_PURE_FUNCTION
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)
static Q_CORE_EXPORT bool concreteBool(QJsonValueConstRef self, bool defaultValue) noexcept Q_DECL_PURE_FUNCTION
static Q_CORE_EXPORT double concreteDouble(QJsonValueConstRef self, double defaultValue) noexcept Q_DECL_PURE_FUNCTION
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
The QSequentialIterable class is an iterable interface for a container in a QVariant.
Combined button and popup list for selecting options.
QMutableListIterator< QByteArray > QMutableByteArrayListIterator
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
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,...)
Q_DECLARE_TYPEINFO(QUuid, Q_PRIMITIVE_TYPE)
\inmodule QtCore\reentrant
QString errorString() const
\variable QCborParserError::offset