1package SevenZip.Compression.RangeCoder;
2import java.io.IOException;
3
4public class BitTreeEncoder
5{
6	short[] Models;
7	int NumBitLevels;
8
9	public BitTreeEncoder(int numBitLevels)
10	{
11		NumBitLevels = numBitLevels;
12		Models = new short[1 << numBitLevels];
13	}
14
15	public void Init()
16	{
17		Decoder.InitBitModels(Models);
18	}
19
20	public void Encode(Encoder rangeEncoder, int symbol) throws IOException
21	{
22		int m = 1;
23		for (int bitIndex = NumBitLevels; bitIndex != 0; )
24		{
25			bitIndex--;
26			int bit = (symbol >>> bitIndex) & 1;
27			rangeEncoder.Encode(Models, m, bit);
28			m = (m << 1) | bit;
29		}
30	}
31
32	public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
33	{
34		int m = 1;
35		for (int  i = 0; i < NumBitLevels; i++)
36		{
37			int bit = symbol & 1;
38			rangeEncoder.Encode(Models, m, bit);
39			m = (m << 1) | bit;
40			symbol >>= 1;
41		}
42	}
43
44	public int GetPrice(int symbol)
45	{
46		int price = 0;
47		int m = 1;
48		for (int bitIndex = NumBitLevels; bitIndex != 0; )
49		{
50			bitIndex--;
51			int bit = (symbol >>> bitIndex) & 1;
52			price += Encoder.GetPrice(Models[m], bit);
53			m = (m << 1) + bit;
54		}
55		return price;
56	}
57
58	public int ReverseGetPrice(int symbol)
59	{
60		int price = 0;
61		int m = 1;
62		for (int i = NumBitLevels; i != 0; i--)
63		{
64			int bit = symbol & 1;
65			symbol >>>= 1;
66			price += Encoder.GetPrice(Models[m], bit);
67			m = (m << 1) | bit;
68		}
69		return price;
70	}
71
72	public static int ReverseGetPrice(short[] Models, int startIndex,
73			int NumBitLevels, int symbol)
74	{
75		int price = 0;
76		int m = 1;
77		for (int i = NumBitLevels; i != 0; i--)
78		{
79			int bit = symbol & 1;
80			symbol >>>= 1;
81			price += Encoder.GetPrice(Models[startIndex + m], bit);
82			m = (m << 1) | bit;
83		}
84		return price;
85	}
86
87	public static void ReverseEncode(short[] Models, int startIndex,
88			Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
89	{
90		int m = 1;
91		for (int i = 0; i < NumBitLevels; i++)
92		{
93			int bit = symbol & 1;
94			rangeEncoder.Encode(Models, startIndex + m, bit);
95			m = (m << 1) | bit;
96			symbol >>= 1;
97		}
98	}
99}
100