99 lines
1.8 KiB
C++
Executable File
99 lines
1.8 KiB
C++
Executable File
|
|
|
|
|
|
#pragma once
|
|
|
|
#ifdef SUPPORT_QBITARRAY
|
|
# include <QtCore/QBitArray>
|
|
#endif
|
|
|
|
namespace LtsUtils
|
|
{
|
|
|
|
namespace BitArray
|
|
{
|
|
constexpr inline int bitNumber(int position)
|
|
{
|
|
return 7 - (position % 8);
|
|
|
|
}
|
|
|
|
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;
|
|
else
|
|
bitField[byteNum] &= ~mask;
|
|
|
|
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;
|
|
else
|
|
ret[byteNum] &= ~mask;
|
|
}
|
|
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);
|
|
ba[i] = bit;
|
|
}
|
|
return ba;
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|