Improve the UTF-16 and UTF-32 codecs with <qendian.h>

This is just the low-hanging fruit. Those algorithms could be much
further improved, but they are so seldom-used that it's not worth it.

Change-Id: I6a540578e810472bb455fffd15332b2a7a1ac901
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
This commit is contained in:
Thiago Macieira 2018-05-29 11:42:40 -05:00
parent d0427759c6
commit e79b56e504

View File

@ -756,26 +756,16 @@ QByteArray QUtf16::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv
char *data = d.data();
if (!state || !(state->flags & QTextCodec::IgnoreHeader)) {
QChar bom(QChar::ByteOrderMark);
if (endian == BigEndianness) {
data[0] = bom.row();
data[1] = bom.cell();
} else {
data[0] = bom.cell();
data[1] = bom.row();
}
if (endian == BigEndianness)
qToBigEndian(bom.unicode(), data);
else
qToLittleEndian(bom.unicode(), data);
data += 2;
}
if (endian == BigEndianness) {
for (int i = 0; i < len; ++i) {
*(data++) = uc[i].row();
*(data++) = uc[i].cell();
}
} else {
for (int i = 0; i < len; ++i) {
*(data++) = uc[i].cell();
*(data++) = uc[i].row();
}
}
if (endian == BigEndianness)
qToBigEndian<ushort>(uc, len, data);
else
qToLittleEndian<ushort>(uc, len, data);
if (state) {
state->remainingChars = 0;
@ -891,20 +881,14 @@ QByteArray QUtf32::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv
if (endian == BigEndianness) {
while (i.hasNext()) {
uint cp = i.next();
*(data++) = cp >> 24;
*(data++) = (cp >> 16) & 0xff;
*(data++) = (cp >> 8) & 0xff;
*(data++) = cp & 0xff;
qToBigEndian(cp, data);
data += 4;
}
} else {
while (i.hasNext()) {
uint cp = i.next();
*(data++) = cp & 0xff;
*(data++) = (cp >> 8) & 0xff;
*(data++) = (cp >> 16) & 0xff;
*(data++) = cp >> 24;
qToLittleEndian(cp, data);
data += 4;
}
}