#pragma once #ifdef SUPPORT_QBITARRAY # include #endif namespace LtsUtils { namespace BitArray { constexpr inline int bitNumber(int position) { return 7 - (position % 8); } template 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 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 inline bool clearBit(T &bitField, int position) { return setBit(bitField, position, false); } #ifdef SUPPORT_QBITARRAY template 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 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 } }