tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RangeCoderBitTree.cs (3525B)


      1 using System;
      2 
      3 namespace SevenZip.Compression.RangeCoder
      4 {
      5 struct BitTreeEncoder
      6 {
      7 	BitEncoder[] Models;
      8 	int NumBitLevels;
      9 
     10 	public BitTreeEncoder(int numBitLevels)
     11 	{
     12 		NumBitLevels = numBitLevels;
     13 		Models = new BitEncoder[1 << numBitLevels];
     14 	}
     15 
     16 	public void Init()
     17 	{
     18 		for (uint i = 1; i < (1 << NumBitLevels); i++)
     19 			Models[i].Init();
     20 	}
     21 
     22 	public void Encode(Encoder rangeEncoder, UInt32 symbol)
     23 	{
     24 		UInt32 m = 1;
     25 		for (int bitIndex = NumBitLevels; bitIndex > 0; )
     26 		{
     27 			bitIndex--;
     28 			UInt32 bit = (symbol >> bitIndex) & 1;
     29 			Models[m].Encode(rangeEncoder, bit);
     30 			m = (m << 1) | bit;
     31 		}
     32 	}
     33 
     34 	public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
     35 	{
     36 		UInt32 m = 1;
     37 		for (UInt32 i = 0; i < NumBitLevels; i++)
     38 		{
     39 			UInt32 bit = symbol & 1;
     40 			Models[m].Encode(rangeEncoder, bit);
     41 			m = (m << 1) | bit;
     42 			symbol >>= 1;
     43 		}
     44 	}
     45 
     46 	public UInt32 GetPrice(UInt32 symbol)
     47 	{
     48 		UInt32 price = 0;
     49 		UInt32 m = 1;
     50 		for (int bitIndex = NumBitLevels; bitIndex > 0; )
     51 		{
     52 			bitIndex--;
     53 			UInt32 bit = (symbol >> bitIndex) & 1;
     54 			price += Models[m].GetPrice(bit);
     55 			m = (m << 1) + bit;
     56 		}
     57 		return price;
     58 	}
     59 
     60 	public UInt32 ReverseGetPrice(UInt32 symbol)
     61 	{
     62 		UInt32 price = 0;
     63 		UInt32 m = 1;
     64 		for (int i = NumBitLevels; i > 0; i--)
     65 		{
     66 			UInt32 bit = symbol & 1;
     67 			symbol >>= 1;
     68 			price += Models[m].GetPrice(bit);
     69 			m = (m << 1) | bit;
     70 		}
     71 		return price;
     72 	}
     73 
     74 	public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex,
     75 		int NumBitLevels, UInt32 symbol)
     76 	{
     77 		UInt32 price = 0;
     78 		UInt32 m = 1;
     79 		for (int i = NumBitLevels; i > 0; i--)
     80 		{
     81 			UInt32 bit = symbol & 1;
     82 			symbol >>= 1;
     83 			price += Models[startIndex + m].GetPrice(bit);
     84 			m = (m << 1) | bit;
     85 		}
     86 		return price;
     87 	}
     88 
     89 	public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
     90 		Encoder rangeEncoder, int NumBitLevels, UInt32 symbol)
     91 	{
     92 		UInt32 m = 1;
     93 		for (int i = 0; i < NumBitLevels; i++)
     94 		{
     95 			UInt32 bit = symbol & 1;
     96 			Models[startIndex + m].Encode(rangeEncoder, bit);
     97 			m = (m << 1) | bit;
     98 			symbol >>= 1;
     99 		}
    100 	}
    101 }
    102 
    103 struct BitTreeDecoder
    104 {
    105 	BitDecoder[] Models;
    106 	int NumBitLevels;
    107 
    108 	public BitTreeDecoder(int numBitLevels)
    109 	{
    110 		NumBitLevels = numBitLevels;
    111 		Models = new BitDecoder[1 << numBitLevels];
    112 	}
    113 
    114 	public void Init()
    115 	{
    116 		for (uint i = 1; i < (1 << NumBitLevels); i++)
    117 			Models[i].Init();
    118 	}
    119 
    120 	public uint Decode(RangeCoder.Decoder rangeDecoder)
    121 	{
    122 		uint m = 1;
    123 		for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
    124 			m = (m << 1) + Models[m].Decode(rangeDecoder);
    125 		return m - ((uint)1 << NumBitLevels);
    126 	}
    127 
    128 	public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
    129 	{
    130 		uint m = 1;
    131 		uint symbol = 0;
    132 		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
    133 		{
    134 			uint bit = Models[m].Decode(rangeDecoder);
    135 			m <<= 1;
    136 			m += bit;
    137 			symbol |= (bit << bitIndex);
    138 		}
    139 		return symbol;
    140 	}
    141 
    142 	public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
    143 		RangeCoder.Decoder rangeDecoder, int NumBitLevels)
    144 	{
    145 		uint m = 1;
    146 		uint symbol = 0;
    147 		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
    148 		{
    149 			uint bit = Models[startIndex + m].Decode(rangeDecoder);
    150 			m <<= 1;
    151 			m += bit;
    152 			symbol |= (bit << bitIndex);
    153 		}
    154 		return symbol;
    155 	}
    156 }
    157 }