improved BitReader

This commit is contained in:
Martchus 2015-07-27 23:16:49 +02:00
parent c62e25ee2a
commit 9f25d76afe
2 changed files with 8 additions and 10 deletions

View File

@ -17,16 +17,10 @@ namespace IoUtilities {
*/ */
void BitReader::skipBits(std::size_t bitCount) void BitReader::skipBits(std::size_t bitCount)
{ {
if(bitCount < m_bitsAvail) { if(bitCount <= m_bitsAvail) {
m_bitsAvail -= bitCount; m_bitsAvail -= bitCount;
if(!m_bitsAvail) {
m_bitsAvail = 8;
if(++m_buffer >= m_end) {
throw ios_base::failure("end of buffer exceeded");
}
}
} else { } else {
if((m_buffer += (bitCount -= m_bitsAvail) / 8) >= m_end) { if((m_buffer += 1 + (bitCount -= m_bitsAvail) / 8) >= m_end) {
throw ios_base::failure("end of buffer exceeded"); throw ios_base::failure("end of buffer exceeded");
} }
m_bitsAvail = 8 - (bitCount % 8); m_bitsAvail = 8 - (bitCount % 8);

View File

@ -53,7 +53,7 @@ inline BitReader::BitReader(const char *buffer, const char *end) :
/*! /*!
* \brief Reads the specified number of bits from the buffer. * \brief Reads the specified number of bits from the buffer.
* \param bitCount Specifies the number of bits read. * \param bitCount Specifies the number of bits read.
* \tparam intType Specifies the return value type. * \tparam intType Specifies the type of the returned value.
* \remarks Does not check whether intType is big enough to hold result. * \remarks Does not check whether intType is big enough to hold result.
* \throws Throws ios_base::failure if the end of the buffer is exceeded. * \throws Throws ios_base::failure if the end of the buffer is exceeded.
* The reader becomes invalid in that case. * The reader becomes invalid in that case.
@ -64,10 +64,10 @@ intType BitReader::readBits(byte bitCount)
intType val = 0; intType val = 0;
for(byte readAtOnce; bitCount; bitCount -= readAtOnce) { for(byte readAtOnce; bitCount; bitCount -= readAtOnce) {
if(!m_bitsAvail) { if(!m_bitsAvail) {
m_bitsAvail = 8;
if(++m_buffer >= m_end) { if(++m_buffer >= m_end) {
throw std::ios_base::failure("end of buffer exceeded"); throw std::ios_base::failure("end of buffer exceeded");
} }
m_bitsAvail = 8;
} }
readAtOnce = std::min(bitCount, m_bitsAvail); readAtOnce = std::min(bitCount, m_bitsAvail);
val = (val << readAtOnce) | (((*m_buffer) >> (m_bitsAvail -= readAtOnce)) & (0xFF >> (0x08 - readAtOnce))); val = (val << readAtOnce) | (((*m_buffer) >> (m_bitsAvail -= readAtOnce)) & (0xFF >> (0x08 - readAtOnce)));
@ -85,6 +85,8 @@ inline std::size_t BitReader::bitsAvailable()
/*! /*!
* \brief Resets the reader. * \brief Resets the reader.
* - Does not take ownership over the specified \a buffer.
* - bufferSize must be equal or greather than 1.
*/ */
inline void BitReader::reset(const char *buffer, size_t bufferSize) inline void BitReader::reset(const char *buffer, size_t bufferSize)
{ {
@ -95,6 +97,8 @@ inline void BitReader::reset(const char *buffer, size_t bufferSize)
/*! /*!
* \brief Resets the reader. * \brief Resets the reader.
* - Does not take ownership over the specified \a buffer.
* - \a end must be greather than \a buffer.
*/ */
inline void BitReader::reset(const char *buffer, const char *end) inline void BitReader::reset(const char *buffer, const char *end)
{ {