QDataStream: speedup steaming of QUuid.
By reading and writing as a whole block, because the size of QUuid is fixed. Reviewed-by: joao (cherry picked from commit d56d7f107f9d18810d742ac4d3a2e36077722cb8) Change-Id: I90554d68da7394c99c48acd0bc5a0eee3b3f7776 Reviewed-on: http://codereview.qt.nokia.com/169 Reviewed-by: Liang Qi <liang.qi@nokia.com>
This commit is contained in:
parent
ae0eb22591
commit
c8888b518b
@ -427,11 +427,30 @@ QString QUuid::toString() const
|
|||||||
*/
|
*/
|
||||||
QDataStream &operator<<(QDataStream &s, const QUuid &id)
|
QDataStream &operator<<(QDataStream &s, const QUuid &id)
|
||||||
{
|
{
|
||||||
s << (quint32)id.data1;
|
QByteArray bytes;
|
||||||
s << (quint16)id.data2;
|
if (s.byteOrder() == QDataStream::BigEndian) {
|
||||||
s << (quint16)id.data3;
|
bytes = id.toRfc4122();
|
||||||
for (int i = 0; i < 8; i++)
|
} else {
|
||||||
s << (quint8)id.data4[i];
|
// we know how many bytes a UUID has, I hope :)
|
||||||
|
bytes = QByteArray(16, Qt::Uninitialized);
|
||||||
|
uchar *data = reinterpret_cast<uchar*>(bytes.data());
|
||||||
|
|
||||||
|
qToLittleEndian(id.data1, data);
|
||||||
|
data += sizeof(quint32);
|
||||||
|
qToLittleEndian(id.data2, data);
|
||||||
|
data += sizeof(quint16);
|
||||||
|
qToLittleEndian(id.data3, data);
|
||||||
|
data += sizeof(quint16);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; ++i) {
|
||||||
|
*(data) = id.data4[i];
|
||||||
|
data++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s.writeRawData(bytes.data(), 16) != 16) {
|
||||||
|
s.setStatus(QDataStream::WriteFailed);
|
||||||
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,19 +460,30 @@ QDataStream &operator<<(QDataStream &s, const QUuid &id)
|
|||||||
*/
|
*/
|
||||||
QDataStream &operator>>(QDataStream &s, QUuid &id)
|
QDataStream &operator>>(QDataStream &s, QUuid &id)
|
||||||
{
|
{
|
||||||
quint32 u32;
|
QByteArray bytes(16, Qt::Uninitialized);
|
||||||
quint16 u16;
|
if (s.readRawData(bytes.data(), 16) != 16) {
|
||||||
quint8 u8;
|
s.setStatus(QDataStream::ReadPastEnd);
|
||||||
s >> u32;
|
return s;
|
||||||
id.data1 = u32;
|
|
||||||
s >> u16;
|
|
||||||
id.data2 = u16;
|
|
||||||
s >> u16;
|
|
||||||
id.data3 = u16;
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
s >> u8;
|
|
||||||
id.data4[i] = u8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s.byteOrder() == QDataStream::BigEndian) {
|
||||||
|
id = QUuid::fromRfc4122(bytes);
|
||||||
|
} else {
|
||||||
|
const uchar *data = reinterpret_cast<const uchar *>(bytes.constData());
|
||||||
|
|
||||||
|
id.data1 = qFromLittleEndian<quint32>(data);
|
||||||
|
data += sizeof(quint32);
|
||||||
|
id.data2 = qFromLittleEndian<quint16>(data);
|
||||||
|
data += sizeof(quint16);
|
||||||
|
id.data3 = qFromLittleEndian<quint16>(data);
|
||||||
|
data += sizeof(quint16);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; ++i) {
|
||||||
|
id.data4[i] = *(data);
|
||||||
|
data++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
#endif // QT_NO_DATASTREAM
|
#endif // QT_NO_DATASTREAM
|
||||||
|
Loading…
x
Reference in New Issue
Block a user