bitreader_helper.h

Go to the documentation of this file.
00001 namespace bitreader_helper {
00002 
00003         inline static size_t extract_bit(const t_uint8 * p_stream,size_t p_offset) {
00004                 return (p_stream[p_offset>>3] >> (7-(p_offset&7)))&1;
00005         }
00006 
00007         static size_t extract_int(const t_uint8 * p_stream,size_t p_base,size_t p_width) {
00008                 size_t ret = 0;
00009                 size_t offset = p_base;
00010                 for(size_t bit=0;bit<p_width;bit++) {
00011                         ret <<= 1;
00012                         ret |= extract_bit(p_stream,offset++);
00013                 }
00014                 return ret;
00015         }
00016 
00017 class bitreader
00018 {
00019 public:
00020         inline bitreader(const t_uint8 * p_ptr,t_size p_base)
00021                 : m_ptr(p_ptr), m_bitptr(p_base)
00022         {
00023         }
00024 
00025         inline void skip(t_size p_bits)
00026         {
00027                 m_bitptr += p_bits;
00028         }
00029 
00030         template<typename t_ret>
00031         t_ret read_t(t_size p_bits) {
00032                 t_ret ret = 0;
00033                 for(t_size bit=0;bit<p_bits;bit++)
00034                 {
00035                         ret <<= 1;
00036                         ret |= (m_ptr[m_bitptr>>3] >> (7-(m_bitptr&7)))&1;
00037                         m_bitptr++;
00038                 }
00039                 return ret;
00040         }
00041 
00042         t_size read(t_size p_bits) {return read_t<t_size>(p_bits);}
00043 
00044         inline t_size get_bitptr() const {return m_bitptr;}
00045 
00046         inline bool read_bit() {
00047                 bool state = ( (m_ptr[m_bitptr>>3] >> (7-(m_bitptr&7)))&1 ) != 0;
00048                 m_bitptr++;
00049                 return state;
00050         }
00051 
00052 private:
00053 
00054         const t_uint8 * m_ptr;
00055         t_size m_bitptr;
00056 };
00057 
00058 class bitreader_fromfile
00059 {
00060 public:
00061         inline bitreader_fromfile(service_ptr_t<file> const& p_file) : m_file(p_file), m_buffer_ptr(0) {}
00062         
00063         t_size read(t_size p_bits,abort_callback & p_abort) {
00064                 t_size ret = 0;
00065                 for(t_size bit=0;bit<p_bits;bit++) {
00066                         if (m_buffer_ptr == 0)
00067                                 m_file->read_object(&m_buffer,1,p_abort);
00068 
00069                         ret <<= 1;
00070                         ret |= (m_buffer >> (7-m_buffer_ptr))&1;
00071                         m_buffer_ptr = (m_buffer_ptr+1) & 7;
00072                 }
00073                 return ret;
00074         }
00075 
00076         void skip(t_size p_bits,abort_callback & p_abort) {
00077                 for(t_size bit=0;bit<p_bits;bit++) {
00078                         if (m_buffer_ptr == 0) m_file->read_object(&m_buffer,1,p_abort);
00079                         m_buffer_ptr = (m_buffer_ptr+1) & 7;
00080                 }
00081         }
00082 
00083         inline void byte_align() {m_buffer_ptr = 0;}
00084 
00085 private:
00086         service_ptr_t<file> m_file;
00087         t_size m_buffer_ptr;
00088         t_uint8 m_buffer;
00089 };
00090 
00091 class bitreader_limited
00092 {
00093 public:
00094         inline bitreader_limited(const t_uint8 * p_ptr,t_size p_base,t_size p_remaining) : m_reader(p_ptr,p_base), m_remaining(p_remaining) {}
00095 
00096         inline t_size get_bitptr() const {return m_reader.get_bitptr();}
00097 
00098         inline t_size get_remaining() const {return m_remaining;}
00099 
00100         inline void skip(t_size p_bits) {
00101                 if (p_bits > m_remaining) throw exception_io_data_truncation();
00102                 m_remaining -= p_bits;
00103                 m_reader.skip(p_bits);
00104         }
00105 
00106         t_size read(t_size p_bits)
00107         {
00108                 if (p_bits > m_remaining) throw exception_io_data_truncation();
00109                 m_remaining -= p_bits;
00110                 return m_reader.read(p_bits);
00111         }
00112 
00113 private:
00114         bitreader m_reader;
00115         t_size m_remaining;
00116 };
00117 
00118 inline static t_size extract_bits(const t_uint8 * p_buffer,t_size p_base,t_size p_count) {
00119         return bitreader(p_buffer,p_base).read(p_count);
00120 }
00121 
00122 }

Generated on Fri Apr 25 18:49:33 2008 for foobar2000 SDK by  doxygen 1.5.5