Files
qt5-legatus-legacy/Lts/Common/LtsUtils/LtsUtilsCore/dds_bitarray.h
T
2026-08-13 18:33:10 +02:00

104 lines
2.1 KiB
C++
Executable File

/**
* Convert a dds::vector<uint8_t> to a QByteArray
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, SLSE, 2016-05-03
*/
#pragma once
#ifdef SUPPORT_QBITARRAY
# include <QtCore/QBitArray>
#endif
namespace LtsUtils
{
namespace BitArray
{
constexpr inline int bitNumber(int position)
{
return 7 - (position % 8); // LSB is left - prefer this to be compatible to TETRA ICD
// return (position % 8); // LSB is right
}
template<typename T>
inline bool testBit(const T &bitField, int position, bool *oob = nullptr)
{
const size_t byteNum = position / 8;
if (byteNum >= bitField.size())
{
if (oob)
*oob = true;
return false;
}
if (oob)
*oob = false;
const typename T::value_type mask = 1 << bitNumber(position);
return ((bitField.at(byteNum) & mask) == mask);
}
template<typename T>
inline bool setBit(T &bitField, int position, bool set = true)
{
const size_t byteNum = position / 8;
if (byteNum >= bitField.size())
return false;
const typename T::value_type mask = 1 << bitNumber(position);
if (set)
bitField[byteNum] |= mask; // set bit
else
bitField[byteNum] &= ~mask; // clear bit
return true;
}
template<typename T>
inline bool clearBit(T &bitField, int position)
{
return setBit(bitField, position, false);
}
#ifdef SUPPORT_QBITARRAY
template<typename T>
inline T convert(const QBitArray &bitArray)
{
T ret;
ret.resize((bitArray.size() + 7) / 8, 0);
for (int i = 0; i < bitArray.size(); ++i)
{
const size_t byteNum = i / 8;
const typename T::value_type mask = (1 << bitNumber(i));
if (bitArray[i])
ret[byteNum] |= mask; // set bit
else
ret[byteNum] &= ~mask; // clear bit
}
return ret;
}
template<typename T>
inline QBitArray convert(T &bitField, int realSize)
{
QBitArray ba(realSize);
for (int32_t i = 0; i < realSize; ++i)
{
const size_t byteNum = i / 8;
const typename T::value_type mask = (1 << bitNumber(i));
bool bit = ((bitField[byteNum] & mask) == mask); // access correct byte and mask correct bit
ba[i] = bit;
}
return ba;
}
#endif
} // namespace BitArray
} // namespace LtsUtils