15 #ifndef ZenBitStream_FastH
16 #define ZenBitStream_FastH
27 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
34 Buffer_Size=Buffer_Size_Init=0;
37 Buffer_Size=Buffer_Size_Init=Size_*8;
41 void Attach(
const int8u* Buffer_,
size_t Size_)
44 Buffer_Size=Buffer_Size_Init=Size_*8;
53 return ((LastByte>>(Buffer_Size%8))&0x1)?
true:
false;
66 return (LastByte&0x80)?
true:
false;
72 static const int8u Mask[9]=
75 0x01, 0x03, 0x07, 0x0f,
76 0x1f, 0x3f, 0x7f, 0xff,
79 if (HowMany<=(Buffer_Size%8))
82 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
85 if (HowMany>Buffer_Size)
92 int8u NewBits=HowMany-(Buffer_Size%8);
96 ToReturn=LastByte<<NewBits;
100 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
101 return ToReturn&Mask[HowMany];
107 static const int16u Mask[17]=
110 0x0001, 0x0003, 0x0007, 0x000f,
111 0x001f, 0x003f, 0x007f, 0x00ff,
112 0x01ff, 0x03ff, 0x07ff, 0x0fff,
113 0x1fff, 0x3fff, 0x7fff, 0xffff,
116 if (HowMany<=(Buffer_Size%8))
118 Buffer_Size-=HowMany;
119 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
122 if (HowMany>Buffer_Size)
129 int8u NewBits=HowMany-(Buffer_Size%8);
133 ToReturn=LastByte<<NewBits;
137 ToReturn|=*Buffer<<NewBits;
142 Buffer_Size-=HowMany;
143 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
144 return ToReturn&Mask[HowMany];
150 static const int32u Mask[33]=
153 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
154 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
155 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
156 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
157 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
158 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
159 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
160 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
163 if (HowMany<=(Buffer_Size%8))
165 Buffer_Size-=HowMany;
166 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
169 if (HowMany>Buffer_Size)
176 int8u NewBits=HowMany-(Buffer_Size%8);
180 ToReturn=LastByte<<NewBits;
181 switch ((NewBits-1)>>3)
184 ToReturn|=*Buffer<<NewBits;
187 ToReturn|=*Buffer<<NewBits;
190 ToReturn|=*Buffer<<NewBits;
196 Buffer_Size-=HowMany;
197 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
198 return ToReturn&Mask[HowMany];
205 int8u HowMany1, HowMany2;
206 int64u Value1, Value2;
211 HowMany2=HowMany-HowMany1;
212 Value1=
Get4(HowMany1);
213 Value2=
Get4(HowMany2);
216 return Value1*0x100000000LL+Value2;
221 if (HowMany<=(Buffer_Size%8))
223 Buffer_Size-=HowMany;
227 if (HowMany>Buffer_Size)
234 Buffer+=(HowMany-(Buffer_Size%8)-1)>>3;
237 Buffer_Size-=HowMany;
243 return ((LastByte>>((Buffer_Size-1)%8))&0x1)?
true:
false;
252 return ((*Buffer)&0x80)?
true:
false;
258 static const int8u Mask[9]=
261 0x01, 0x03, 0x07, 0x0f,
262 0x1f, 0x3f, 0x7f, 0xff,
265 if (HowMany<=(Buffer_Size%8))
266 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
268 if (HowMany>Buffer_Size)
275 int8u NewBits=HowMany-(Buffer_Size%8);
279 ToReturn=LastByte<<NewBits;
280 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
282 return ToReturn&Mask[HowMany];
288 static const int16u Mask[17]=
291 0x0001, 0x0003, 0x0007, 0x000f,
292 0x001f, 0x003f, 0x007f, 0x00ff,
293 0x01ff, 0x03ff, 0x07ff, 0x0fff,
294 0x1fff, 0x3fff, 0x7fff, 0xffff,
297 if (HowMany<=(Buffer_Size%8))
298 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
300 if (HowMany>Buffer_Size)
307 const int8u* Buffer_Save=Buffer;
309 int8u NewBits=HowMany-(Buffer_Size%8);
313 ToReturn=LastByte<<NewBits;
317 ToReturn|=*Buffer<<NewBits;
320 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
324 return ToReturn&Mask[HowMany];
330 static const int32u Mask[33]=
333 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
334 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
335 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
336 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
337 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
338 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
339 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
340 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
343 if (HowMany<=(Buffer_Size%8))
344 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
346 if (HowMany>Buffer_Size)
353 const int8u* Buffer_Save=Buffer;
355 int8u NewBits=HowMany-(Buffer_Size%8);
359 ToReturn=LastByte<<NewBits;
360 switch ((NewBits-1)>>3)
363 ToReturn|=*Buffer<<NewBits;
366 ToReturn|=*Buffer<<NewBits;
369 ToReturn|=*Buffer<<NewBits;
373 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
377 return ToReturn&Mask[HowMany];
382 return (int64u)
Peek4(HowMany);
392 Skip (Buffer_Size%8);
397 return (Buffer_Size_Init-Buffer_Size)/8;
402 return Buffer_Size%8;
407 return Buffer_Size%8;
413 size_t Buffer_Size_Init;