QUuid: convert bswap(Id128Bytes) to a hidden friend of Id128Bytes
... and rename it to qbswap(), thus enabling the endian conversions for Id128bytes via q{To,From}{Little,Big}Endian() functions. Found during Qt 6.6 API Review. Pick-to: 6.6 Change-Id: Ie320cee52ec2b9de0aaa112adec8febb7f5b68a2 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
parent
e6a36f21a3
commit
470b2b8ad9
@ -300,6 +300,54 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
|
|||||||
values.
|
values.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src)
|
||||||
|
\since 6.6
|
||||||
|
\relates QUuid::Id128Bytes
|
||||||
|
\overload
|
||||||
|
|
||||||
|
Converts \a src from big-endian byte order and returns the struct holding
|
||||||
|
the binary representation of UUID in host byte order.
|
||||||
|
|
||||||
|
\sa <QtEndian>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src)
|
||||||
|
\since 6.6
|
||||||
|
\relates QUuid::Id128Bytes
|
||||||
|
\overload
|
||||||
|
|
||||||
|
Converts \a src from little-endian byte order and returns the struct holding
|
||||||
|
the binary representation of UUID in host byte order.
|
||||||
|
|
||||||
|
\sa <QtEndian>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src)
|
||||||
|
\since 6.6
|
||||||
|
\relates QUuid::Id128Bytes
|
||||||
|
\overload
|
||||||
|
|
||||||
|
Converts \a src from host byte order and returns the struct holding the
|
||||||
|
binary representation of UUID in big-endian byte order.
|
||||||
|
|
||||||
|
\sa <QtEndian>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn QUuid::Id128Bytes qToLittleEndian(QUuid::Id128Bytes src)
|
||||||
|
\since 6.6
|
||||||
|
\relates QUuid::Id128Bytes
|
||||||
|
\overload
|
||||||
|
|
||||||
|
Converts \a src from host byte order and returns the struct holding the
|
||||||
|
binary representation of UUID in little-endian byte order.
|
||||||
|
|
||||||
|
\sa <QtEndian>
|
||||||
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QUuid::QUuid(Id128Bytes id128, QSysInfo::Endian order) noexcept
|
\fn QUuid::QUuid(Id128Bytes id128, QSysInfo::Endian order) noexcept
|
||||||
\since 6.6
|
\since 6.6
|
||||||
|
@ -68,6 +68,16 @@ public:
|
|||||||
{
|
{
|
||||||
return QByteArrayView(data, sizeof(data));
|
return QByteArrayView(data, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend constexpr Id128Bytes qbswap(Id128Bytes b) noexcept
|
||||||
|
{
|
||||||
|
// 128-bit byte swap
|
||||||
|
auto b0 = qbswap(b.data64[0]);
|
||||||
|
auto b1 = qbswap(b.data64[1]);
|
||||||
|
b.data64[0] = b1;
|
||||||
|
b.data64[1] = b0;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr QUuid() noexcept : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {}
|
constexpr QUuid() noexcept : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {}
|
||||||
@ -188,17 +198,6 @@ public:
|
|||||||
ushort data2;
|
ushort data2;
|
||||||
ushort data3;
|
ushort data3;
|
||||||
uchar data4[8];
|
uchar data4[8];
|
||||||
|
|
||||||
private:
|
|
||||||
static constexpr Id128Bytes bswap(Id128Bytes b)
|
|
||||||
{
|
|
||||||
// 128-bit byte swap
|
|
||||||
auto b0 = qbswap(b.data64[0]);
|
|
||||||
auto b1 = qbswap(b.data64[1]);
|
|
||||||
b.data64[0] = b1;
|
|
||||||
b.data64[1] = b0;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_TYPEINFO(QUuid, Q_PRIMITIVE_TYPE);
|
Q_DECLARE_TYPEINFO(QUuid, Q_PRIMITIVE_TYPE);
|
||||||
@ -217,7 +216,7 @@ Q_CORE_EXPORT size_t qHash(const QUuid &uuid, size_t seed = 0) noexcept;
|
|||||||
QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order) noexcept
|
QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order) noexcept
|
||||||
{
|
{
|
||||||
if (order == QSysInfo::LittleEndian)
|
if (order == QSysInfo::LittleEndian)
|
||||||
uuid = bswap(uuid);
|
uuid = qbswap(uuid);
|
||||||
data1 = qFromBigEndian<quint32>(&uuid.data[0]);
|
data1 = qFromBigEndian<quint32>(&uuid.data[0]);
|
||||||
data2 = qFromBigEndian<quint16>(&uuid.data[4]);
|
data2 = qFromBigEndian<quint16>(&uuid.data[4]);
|
||||||
data3 = qFromBigEndian<quint16>(&uuid.data[6]);
|
data3 = qFromBigEndian<quint16>(&uuid.data[6]);
|
||||||
@ -232,7 +231,7 @@ QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order) const noexcept
|
|||||||
qToBigEndian(data3, &result.data[6]);
|
qToBigEndian(data3, &result.data[6]);
|
||||||
memcpy(&result.data[8], data4, sizeof(data4));
|
memcpy(&result.data[8], data4, sizeof(data4));
|
||||||
if (order == QSysInfo::LittleEndian)
|
if (order == QSysInfo::LittleEndian)
|
||||||
return bswap(result);
|
return qbswap(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,6 +290,15 @@ inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept
|
|||||||
inline bool operator>=(const QUuid &lhs, const QUuid &rhs) noexcept
|
inline bool operator>=(const QUuid &lhs, const QUuid &rhs) noexcept
|
||||||
{ return !(lhs < rhs); }
|
{ return !(lhs < rhs); }
|
||||||
|
|
||||||
|
#if defined(Q_QDOC)
|
||||||
|
// provide fake declarations of qXXXEndian() functions, so that qDoc could
|
||||||
|
// distinguish them from the general template
|
||||||
|
QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src);
|
||||||
|
QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src);
|
||||||
|
QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src);
|
||||||
|
QUuid::Id128Bytes qToLittleEndian(QUuid::Id128Bytes src);
|
||||||
|
#endif
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QUUID_H
|
#endif // QUUID_H
|
||||||
|
@ -244,6 +244,23 @@ void tst_QUuid::id128()
|
|||||||
leBytesA.data[15 - i] = bytesA.data[i];
|
leBytesA.data[15 - i] = bytesA.data[i];
|
||||||
QCOMPARE(QUuid(leBytesA, QSysInfo::LittleEndian), uuidA);
|
QCOMPARE(QUuid(leBytesA, QSysInfo::LittleEndian), uuidA);
|
||||||
QVERIFY(memcmp(uuidA.toBytes(QSysInfo::LittleEndian).data, leBytesA.data, sizeof(leBytesA)) == 0);
|
QVERIFY(memcmp(uuidA.toBytes(QSysInfo::LittleEndian).data, leBytesA.data, sizeof(leBytesA)) == 0);
|
||||||
|
|
||||||
|
// check the new q{To,From}{Big,Little}Endian() overloads
|
||||||
|
QUuid::Id128Bytes roundtrip = qFromLittleEndian(qToLittleEndian(bytesA));
|
||||||
|
QVERIFY(memcmp(roundtrip.data, bytesA.data, sizeof(bytesA)) == 0);
|
||||||
|
roundtrip = qFromBigEndian(qToBigEndian(bytesA));
|
||||||
|
QVERIFY(memcmp(roundtrip.data, bytesA.data, sizeof(bytesA)) == 0);
|
||||||
|
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||||
|
const QUuid::Id128Bytes beBytesA = qToBigEndian(leBytesA);
|
||||||
|
QVERIFY(memcmp(beBytesA.data, bytesA.data, sizeof(beBytesA)) == 0);
|
||||||
|
const QUuid::Id128Bytes otherLeBytesA = qFromBigEndian(bytesA);
|
||||||
|
QVERIFY(memcmp(otherLeBytesA.data, leBytesA.data, sizeof(leBytesA)) == 0);
|
||||||
|
#else // Q_BIG_ENDIAN
|
||||||
|
const QUuid::Id128Bytes otherLeBytesA = qToLittleEndian(bytesA);
|
||||||
|
QVERIFY(memcmp(otherLeBytesA.data, leBytesA.data, sizeof(leBytesA)) == 0);
|
||||||
|
const QUuid::Id128Bytes beBytesA = qFromLittleEndian(leBytesA);
|
||||||
|
QVERIFY(memcmp(beBytesA.data, bytesA.data, sizeof(beBytesA)) == 0);
|
||||||
|
#endif // Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QUuid::uint128()
|
void tst_QUuid::uint128()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user