QBitArray: refactor operator~() to write to an uninitialized buffer
No functionality change otherwise. Change-Id: I85b3fc2dd45c4693be13fffd179627b2747c132b Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
parent
9323351695
commit
9b176281df
@ -594,18 +594,26 @@ QBitArray &QBitArray::operator^=(const QBitArray &other)
|
|||||||
|
|
||||||
QBitArray QBitArray::operator~() const
|
QBitArray QBitArray::operator~() const
|
||||||
{
|
{
|
||||||
qsizetype sz = size();
|
qsizetype n = d.size();
|
||||||
QBitArray a(sz);
|
QBitArray result(QByteArrayData(n, n));
|
||||||
const uchar *a1 = reinterpret_cast<const uchar *>(d.constData()) + 1;
|
const uchar *src = reinterpret_cast<const uchar *>(data_ptr().data());
|
||||||
uchar *a2 = reinterpret_cast<uchar *>(a.d.data()) + 1;
|
uchar *dst = reinterpret_cast<uchar *>(result.data_ptr().data());
|
||||||
qsizetype n = d.size() - 1;
|
|
||||||
|
|
||||||
while (n-- > 0)
|
uchar bitdiff = 8;
|
||||||
*a2++ = ~*a1++;
|
if (n)
|
||||||
|
bitdiff = dst[0] = src[0]; // copy the count of bits in the last byte
|
||||||
|
|
||||||
if (sz && sz % 8)
|
for (qsizetype i = 1; i < n; ++i)
|
||||||
*(a2 - 1) &= (1 << (sz % 8)) - 1;
|
dst[i] = ~src[i];
|
||||||
return a;
|
|
||||||
|
if (int tailCount = 16 - bitdiff; tailCount != 8) {
|
||||||
|
// zero the bits beyond our size in the last byte
|
||||||
|
Q_ASSERT(n > 1);
|
||||||
|
uchar tailMask = (1U << tailCount) - 1;
|
||||||
|
dst[n - 1] &= tailMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -18,6 +18,8 @@ class Q_CORE_EXPORT QBitArray
|
|||||||
friend Q_CORE_EXPORT size_t qHash(const QBitArray &key, size_t seed) noexcept;
|
friend Q_CORE_EXPORT size_t qHash(const QBitArray &key, size_t seed) noexcept;
|
||||||
QByteArray d;
|
QByteArray d;
|
||||||
|
|
||||||
|
QBitArray(QByteArrayData &&dd) : d(std::move(dd)) {}
|
||||||
|
|
||||||
template <typename BitArray> static auto bitLocation(BitArray &ba, qsizetype i)
|
template <typename BitArray> static auto bitLocation(BitArray &ba, qsizetype i)
|
||||||
{
|
{
|
||||||
Q_ASSERT(size_t(i) < size_t(ba.size()));
|
Q_ASSERT(size_t(i) < size_t(ba.size()));
|
||||||
@ -95,6 +97,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
typedef QByteArray::DataPointer DataPtr;
|
typedef QByteArray::DataPointer DataPtr;
|
||||||
inline DataPtr &data_ptr() { return d.data_ptr(); }
|
inline DataPtr &data_ptr() { return d.data_ptr(); }
|
||||||
|
inline const DataPtr &data_ptr() const { return d.data_ptr(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user