00001
00006 #ifndef _BITARRAY_H_
00007 #define _BITARRAY_H_
00008
00009 #include "bitstream.h"
00010
00020 template<typename T> class Bitarray
00021 {
00022 public:
00023
00031 Bitarray(Bitstream &bs)
00032 {
00033 bs.Read(m_data, T::size);
00034 }
00035
00041 void Write(Bitstream &bs) const
00042 {
00043 bs.Write(m_data, T::size);
00044 }
00045
00053 int Get(int i) const
00054 {
00055 int startbit = T::bits[i] & 0x1F;
00056 int endbit = T::bits[i+1] & 0x1F;
00057
00058
00059 return m_data[T::bits[i] >> 5] << startbit >> (32 - endbit + startbit);
00060 }
00061
00069 void Set(int i, int x)
00070 {
00071 int startbit = T::bits[i] & 0x1F;
00072 int endbit = T::bits[i+1] & 0x1F;
00073 int intnum = T::bits[i] >> 5;
00074
00075 unsigned int mask = ((unsigned int)(~0) >> startbit) &
00076 ((unsigned int)(~0) << (32 - endbit));
00077
00078
00079 m_data[intnum] &= ~mask;
00080 m_data[intnum] |= (x << (32 - endbit)) & mask;
00081 }
00082
00089 int Max(int i) const
00090 {
00091 return (1 << (T::bits[i+1] - T::bits[i])) - 1;
00092 }
00093
00105 unsigned int operator^ (int i) const
00106 {
00107 return Get(i);
00108 }
00109
00110 private:
00111 unsigned int m_data[((T::size) + 31) >> 5];
00112
00113 };
00114
00115 #endif //_BITARRAY_H_