bititerator.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <assert.h>
00023 #include "bititerator.h"
00024
00025 namespace OpenRaw {
00026 namespace Internals {
00027
00028 BitIterator::BitIterator(const void * const p) :
00029 m_p(static_cast<const uint8_t * const>(p)),
00030 m_bitBuffer(0), m_bitsOnBuffer(0)
00031
00032 {
00033 }
00034
00035 void BitIterator::load(size_t numBits)
00036 {
00037 size_t numBytes = (numBits + 7) / 8;
00038
00039
00040 m_bitBuffer >>= (32 - m_bitsOnBuffer);
00041
00042 m_bitsOnBuffer += 8 * numBytes;
00043
00044
00045 for (size_t i = 0; i < numBytes; ++i) {
00046 m_bitBuffer = (m_bitBuffer << 8) | *m_p;
00047 ++m_p;
00048 }
00049
00050
00051 m_bitBuffer = m_bitBuffer << (32 - m_bitsOnBuffer);
00052 }
00053
00054 uint32_t BitIterator::get(size_t n)
00055 {
00056 assert(n <= 25);
00057
00058 if (n == 0)
00059 return 0;
00060
00061 if (n > m_bitsOnBuffer)
00062 load(n - m_bitsOnBuffer);
00063
00064 assert(n <= m_bitsOnBuffer);
00065
00066 uint32_t ret = m_bitBuffer >> (32 - n);
00067 m_bitsOnBuffer -= n;
00068 m_bitBuffer <<= n;
00069
00070 return ret;
00071 }
00072
00073 }
00074 }