3 namespace SevenZip.Compression.RangeCoder
10 public BitTreeEncoder(int numBitLevels)
12 NumBitLevels = numBitLevels;
13 Models = new BitEncoder[1 << numBitLevels];
18 for (uint i = 1; i < (1 << NumBitLevels); i++)
22 public void Encode(Encoder rangeEncoder, UInt32 symbol)
25 for (int bitIndex = NumBitLevels; bitIndex > 0; )
28 UInt32 bit = (symbol >> bitIndex) & 1;
29 Models[m].Encode(rangeEncoder, bit);
34 public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
37 for (UInt32 i = 0; i < NumBitLevels; i++)
39 UInt32 bit = symbol & 1;
40 Models[m].Encode(rangeEncoder, bit);
46 public UInt32 GetPrice(UInt32 symbol)
50 for (int bitIndex = NumBitLevels; bitIndex > 0; )
53 UInt32 bit = (symbol >> bitIndex) & 1;
54 price += Models[m].GetPrice(bit);
60 public UInt32 ReverseGetPrice(UInt32 symbol)
64 for (int i = NumBitLevels; i > 0; i--)
66 UInt32 bit = symbol & 1;
68 price += Models[m].GetPrice(bit);
74 public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex,
75 int NumBitLevels, UInt32 symbol)
79 for (int i = NumBitLevels; i > 0; i--)
81 UInt32 bit = symbol & 1;
83 price += Models[startIndex + m].GetPrice(bit);
89 public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
90 Encoder rangeEncoder, int NumBitLevels, UInt32 symbol)
93 for (int i = 0; i < NumBitLevels; i++)
95 UInt32 bit = symbol & 1;
96 Models[startIndex + m].Encode(rangeEncoder, bit);
103 struct BitTreeDecoder
108 public BitTreeDecoder(int numBitLevels)
110 NumBitLevels = numBitLevels;
111 Models = new BitDecoder[1 << numBitLevels];
116 for (uint i = 1; i < (1 << NumBitLevels); i++)
120 public uint Decode(RangeCoder.Decoder rangeDecoder)
123 for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
124 m = (m << 1) + Models[m].Decode(rangeDecoder);
125 return m - ((uint)1 << NumBitLevels);
128 public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
132 for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
134 uint bit = Models[m].Decode(rangeDecoder);
137 symbol |= (bit << bitIndex);
142 public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
143 RangeCoder.Decoder rangeDecoder, int NumBitLevels)
147 for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
149 uint bit = Models[startIndex + m].Decode(rangeDecoder);
152 symbol |= (bit << bitIndex);