1 #ifndef IOUTILITIES_BITREADER_H
2 #define IOUTILITIES_BITREADER_H
15 BitReader(
const char *buffer, std::size_t bufferSize);
16 BitReader(
const char *buffer,
const char *end);
18 template <
typename intType> intType readBits(std::uint8_t bitCount);
19 std::uint8_t readBit();
20 template <
typename intType> intType readUnsignedExpGolombCodedBits();
21 template <
typename intType> intType readSignedExpGolombCodedBits();
22 template <
typename intType> intType showBits(std::uint8_t bitCount);
23 void skipBits(std::size_t bitCount);
25 std::size_t bitsAvailable();
26 void reset(
const char *buffer, std::size_t bufferSize);
27 void reset(
const char *buffer,
const char *end);
30 const std::uint8_t *m_buffer;
31 const std::uint8_t *m_end;
32 std::uint8_t m_bitsAvail;
53 : m_buffer(reinterpret_cast<const std::uint8_t *>(buffer))
54 , m_end(reinterpret_cast<const std::uint8_t *>(end))
70 for (std::uint8_t readAtOnce; bitCount; bitCount -= readAtOnce) {
72 if (++m_buffer >= m_end) {
73 throw std::ios_base::failure(
"end of buffer exceeded");
77 readAtOnce =
std::min(bitCount, m_bitsAvail);
78 val =
static_cast<intType
>((val << readAtOnce) | (((*m_buffer) >> (m_bitsAvail -= readAtOnce)) & (0xFF >> (0x08 - readAtOnce))));
90 return readBits<std::uint8_t>(1) == 1;
103 std::uint8_t count = 0;
107 return count ? (((1 << count) | readBits<intType>(count)) - 1) : 0;
120 auto value = readUnsignedExpGolombCodedBits<typename std::make_unsigned<intType>::type>();
121 return (value % 2) ?
static_cast<intType
>((value + 1) / 2) : (-
static_cast<intType
>(value / 2));
130 return tmp.readBits<intType>(bitCount);
138 return m_buffer != m_end ?
static_cast<std::size_t
>(((m_end - m_buffer - 1) * 8) + m_bitsAvail) :
static_cast<std::size_t
>(0);
149 m_buffer =
reinterpret_cast<const std::uint8_t *
>(buffer);
150 m_end =
reinterpret_cast<const std::uint8_t *
>(buffer + bufferSize);
162 m_buffer =
reinterpret_cast<const std::uint8_t *
>(buffer);
163 m_end =
reinterpret_cast<const std::uint8_t *
>(end);
177 #endif // IOUTILITIES_BITREADER_H