hackedteam/vector-edk

View on GitHub
vector-uefi/insyde/7zip/Java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java

Summary

Maintainability
A
35 mins
Test Coverage
package SevenZip.Compression.RangeCoder;
import java.io.IOException;

public class BitTreeEncoder
{
    short[] Models;
    int NumBitLevels;
    
    public BitTreeEncoder(int numBitLevels)
    {
        NumBitLevels = numBitLevels;
        Models = new short[1 << numBitLevels];
    }
    
    public void Init()
    {
        Decoder.InitBitModels(Models);
    }
    
    public void Encode(Encoder rangeEncoder, int symbol) throws IOException
    {
        int m = 1;
        for (int bitIndex = NumBitLevels; bitIndex != 0; )
        {
            bitIndex--;
            int bit = (symbol >>> bitIndex) & 1;
            rangeEncoder.Encode(Models, m, bit);
            m = (m << 1) | bit;
        }
    }
    
    public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
    {
        int m = 1;
        for (int  i = 0; i < NumBitLevels; i++)
        {
            int bit = symbol & 1;
            rangeEncoder.Encode(Models, m, bit);
            m = (m << 1) | bit;
            symbol >>= 1;
        }
    }
    
    public int GetPrice(int symbol)
    {
        int price = 0;
        int m = 1;
        for (int bitIndex = NumBitLevels; bitIndex != 0; )
        {
            bitIndex--;
            int bit = (symbol >>> bitIndex) & 1;
            price += Encoder.GetPrice(Models[m], bit);
            m = (m << 1) + bit;
        }
        return price;
    }
    
    public int ReverseGetPrice(int symbol)
    {
        int price = 0;
        int m = 1;
        for (int i = NumBitLevels; i != 0; i--)
        {
            int bit = symbol & 1;
            symbol >>>= 1;
            price += Encoder.GetPrice(Models[m], bit);
            m = (m << 1) | bit;
        }
        return price;
    }
    
    public static int ReverseGetPrice(short[] Models, int startIndex,
            int NumBitLevels, int symbol)
    {
        int price = 0;
        int m = 1;
        for (int i = NumBitLevels; i != 0; i--)
        {
            int bit = symbol & 1;
            symbol >>>= 1;
            price += Encoder.GetPrice(Models[startIndex + m], bit);
            m = (m << 1) | bit;
        }
        return price;
    }
    
    public static void ReverseEncode(short[] Models, int startIndex,
            Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
    {
        int m = 1;
        for (int i = 0; i < NumBitLevels; i++)
        {
            int bit = symbol & 1;
            rangeEncoder.Encode(Models, startIndex + m, bit);
            m = (m << 1) | bit;
            symbol >>= 1;
        }
    }
}