29 #ifndef ZenBitStream_FastH
30 #define ZenBitStream_FastH
41 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
48 Buffer_Size=Buffer_Size_Init=0;
51 Buffer_Size=Buffer_Size_Init=Size_*8;
55 void Attach(
const int8u* Buffer_,
size_t Size_)
58 Buffer_Size=Buffer_Size_Init=Size_*8;
67 return ((LastByte>>(Buffer_Size%8))&0x1)?
true:
false;
80 return (LastByte&0x80)?
true:
false;
86 static const int8u Mask[9]=
89 0x01, 0x03, 0x07, 0x0f,
90 0x1f, 0x3f, 0x7f, 0xff,
93 if (HowMany<=(Buffer_Size%8))
96 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
99 if (HowMany>Buffer_Size)
106 int8u NewBits=HowMany-(Buffer_Size%8);
110 ToReturn=LastByte<<NewBits;
113 Buffer_Size-=HowMany;
114 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
115 return ToReturn&Mask[HowMany];
121 static const int16u Mask[17]=
124 0x0001, 0x0003, 0x0007, 0x000f,
125 0x001f, 0x003f, 0x007f, 0x00ff,
126 0x01ff, 0x03ff, 0x07ff, 0x0fff,
127 0x1fff, 0x3fff, 0x7fff, 0xffff,
130 if (HowMany<=(Buffer_Size%8))
132 Buffer_Size-=HowMany;
133 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
136 if (HowMany>Buffer_Size)
143 int8u NewBits=HowMany-(Buffer_Size%8);
147 ToReturn=LastByte<<NewBits;
151 ToReturn|=*Buffer<<NewBits;
156 Buffer_Size-=HowMany;
157 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
158 return ToReturn&Mask[HowMany];
164 static const int32u Mask[33]=
167 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
168 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
169 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
170 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
171 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
172 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
173 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
174 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
177 if (HowMany<=(Buffer_Size%8))
179 Buffer_Size-=HowMany;
180 return (LastByte>>(Buffer_Size%8))&Mask[HowMany];
183 if (HowMany>Buffer_Size)
190 int8u NewBits=HowMany-(Buffer_Size%8);
194 ToReturn=LastByte<<NewBits;
195 switch ((NewBits-1)>>3)
198 ToReturn|=*Buffer<<NewBits;
201 ToReturn|=*Buffer<<NewBits;
204 ToReturn|=*Buffer<<NewBits;
210 Buffer_Size-=HowMany;
211 ToReturn|=(LastByte>>(Buffer_Size%8))&Mask[NewBits];
212 return ToReturn&Mask[HowMany];
219 int8u HowMany1, HowMany2;
220 int64u Value1, Value2;
225 HowMany2=HowMany-HowMany1;
226 Value1=
Get4(HowMany1);
227 Value2=
Get4(HowMany2);
230 return Value1*0x100000000LL+Value2;
235 if (HowMany<=(Buffer_Size%8))
237 Buffer_Size-=HowMany;
241 if (HowMany>Buffer_Size)
248 Buffer+=(HowMany-(Buffer_Size%8)-1)>>3;
251 Buffer_Size-=HowMany;
257 return ((LastByte>>((Buffer_Size-1)%8))&0x1)?
true:
false;
266 return ((*Buffer)&0x80)?
true:
false;
272 static const int8u Mask[9]=
275 0x01, 0x03, 0x07, 0x0f,
276 0x1f, 0x3f, 0x7f, 0xff,
279 if (HowMany<=(Buffer_Size%8))
280 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
282 if (HowMany>Buffer_Size)
289 int8u NewBits=HowMany-(Buffer_Size%8);
293 ToReturn=LastByte<<NewBits;
294 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
296 return ToReturn&Mask[HowMany];
302 static const int16u Mask[17]=
305 0x0001, 0x0003, 0x0007, 0x000f,
306 0x001f, 0x003f, 0x007f, 0x00ff,
307 0x01ff, 0x03ff, 0x07ff, 0x0fff,
308 0x1fff, 0x3fff, 0x7fff, 0xffff,
311 if (HowMany<=(Buffer_Size%8))
312 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
314 if (HowMany>Buffer_Size)
321 const int8u* Buffer_Save=Buffer;
323 int8u NewBits=HowMany-(Buffer_Size%8);
327 ToReturn=LastByte<<NewBits;
331 ToReturn|=*Buffer<<NewBits;
334 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
338 return ToReturn&Mask[HowMany];
344 static const int32u Mask[33]=
347 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
348 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
349 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
350 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
351 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
352 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
353 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
354 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
357 if (HowMany<=(Buffer_Size%8))
358 return (LastByte>>((Buffer_Size-HowMany)%8))&Mask[HowMany];
360 if (HowMany>Buffer_Size)
367 const int8u* Buffer_Save=Buffer;
369 int8u NewBits=HowMany-(Buffer_Size%8);
373 ToReturn=LastByte<<NewBits;
374 switch ((NewBits-1)>>3)
377 ToReturn|=*Buffer<<NewBits;
380 ToReturn|=*Buffer<<NewBits;
383 ToReturn|=*Buffer<<NewBits;
387 ToReturn|=((*Buffer)>>((Buffer_Size-HowMany)%8))&Mask[NewBits];
391 return ToReturn&Mask[HowMany];
396 return (int64u)
Peek4(HowMany);
406 Skip (Buffer_Size%8);
411 return (Buffer_Size_Init-Buffer_Size)/8;
416 return Buffer_Size%8;
421 return Buffer_Size%8;
427 size_t Buffer_Size_Init;