other-licenses/7zstub/src/7zip/Compress/RangeCoder/RangeCoderBitTree.h

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 // Compress/RangeCoder/RangeCoderBitTree.h
     3 #ifndef __COMPRESS_RANGECODER_BIT_TREE_H
     4 #define __COMPRESS_RANGECODER_BIT_TREE_H
     6 #include "RangeCoderBit.h"
     7 #include "RangeCoderOpt.h"
     9 namespace NCompress {
    10 namespace NRangeCoder {
    12 template <int numMoveBits, int NumBitLevels>
    13 class CBitTreeEncoder
    14 {
    15   CBitEncoder<numMoveBits> Models[1 << NumBitLevels];
    16 public:
    17   void Init()
    18   {
    19     for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
    20       Models[i].Init();
    21   }
    22   void Encode(CEncoder *rangeEncoder, UInt32 symbol)
    23   {
    24     UInt32 modelIndex = 1;
    25     for (int bitIndex = NumBitLevels; bitIndex != 0 ;)
    26     {
    27       bitIndex--;
    28       UInt32 bit = (symbol >> bitIndex) & 1;
    29       Models[modelIndex].Encode(rangeEncoder, bit);
    30       modelIndex = (modelIndex << 1) | bit;
    31     }
    32   };
    33   void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol)
    34   {
    35     UInt32 modelIndex = 1;
    36     for (int i = 0; i < NumBitLevels; i++)
    37     {
    38       UInt32 bit = symbol & 1;
    39       Models[modelIndex].Encode(rangeEncoder, bit);
    40       modelIndex = (modelIndex << 1) | bit;
    41       symbol >>= 1;
    42     }
    43   }
    44   UInt32 GetPrice(UInt32 symbol) const
    45   {
    46     symbol |= (1 << NumBitLevels);
    47     UInt32 price = 0;
    48     while (symbol != 1)
    49     {
    50       price += Models[symbol >> 1].GetPrice(symbol & 1);
    51       symbol >>= 1;
    52     }
    53     return price;
    54   }
    55   UInt32 ReverseGetPrice(UInt32 symbol) const
    56   {
    57     UInt32 price = 0;
    58     UInt32 modelIndex = 1;
    59     for (int i = NumBitLevels; i != 0; i--)
    60     {
    61       UInt32 bit = symbol & 1;
    62       symbol >>= 1;
    63       price += Models[modelIndex].GetPrice(bit);
    64       modelIndex = (modelIndex << 1) | bit;
    65     }
    66     return price;
    67   }
    68 };
    70 template <int numMoveBits, int NumBitLevels>
    71 class CBitTreeDecoder
    72 {
    73   CBitDecoder<numMoveBits> Models[1 << NumBitLevels];
    74 public:
    75   void Init()
    76   {
    77     for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
    78       Models[i].Init();
    79   }
    80   UInt32 Decode(CDecoder *rangeDecoder)
    81   {
    82     UInt32 modelIndex = 1;
    83     RC_INIT_VAR
    84     for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
    85     {
    86       // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder);
    87       RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex)
    88     }
    89     RC_FLUSH_VAR
    90     return modelIndex - (1 << NumBitLevels);
    91   };
    92   UInt32 ReverseDecode(CDecoder *rangeDecoder)
    93   {
    94     UInt32 modelIndex = 1;
    95     UInt32 symbol = 0;
    96     RC_INIT_VAR
    97     for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
    98     {
    99       // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
   100       // modelIndex <<= 1;
   101       // modelIndex += bit;
   102       // symbol |= (bit << bitIndex);
   103       RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
   104     }
   105     RC_FLUSH_VAR
   106     return symbol;
   107   }
   108 };
   110 template <int numMoveBits>
   111 void ReverseBitTreeEncode(CBitEncoder<numMoveBits> *Models, 
   112     CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol)
   113 {
   114   UInt32 modelIndex = 1;
   115   for (int i = 0; i < NumBitLevels; i++)
   116   {
   117     UInt32 bit = symbol & 1;
   118     Models[modelIndex].Encode(rangeEncoder, bit);
   119     modelIndex = (modelIndex << 1) | bit;
   120     symbol >>= 1;
   121   }
   122 }
   124 template <int numMoveBits>
   125 UInt32 ReverseBitTreeGetPrice(CBitEncoder<numMoveBits> *Models, 
   126     UInt32 NumBitLevels, UInt32 symbol)
   127 {
   128   UInt32 price = 0;
   129   UInt32 modelIndex = 1;
   130   for (int i = NumBitLevels; i != 0; i--)
   131   {
   132     UInt32 bit = symbol & 1;
   133     symbol >>= 1;
   134     price += Models[modelIndex].GetPrice(bit);
   135     modelIndex = (modelIndex << 1) | bit;
   136   }
   137   return price;
   138 }
   140 template <int numMoveBits>
   141 UInt32 ReverseBitTreeDecode(CBitDecoder<numMoveBits> *Models, 
   142     CDecoder *rangeDecoder, int NumBitLevels)
   143 {
   144   UInt32 modelIndex = 1;
   145   UInt32 symbol = 0;
   146   RC_INIT_VAR
   147   for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
   148   {
   149     // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
   150     // modelIndex <<= 1;
   151     // modelIndex += bit;
   152     // symbol |= (bit << bitIndex);
   153     RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
   154   }
   155   RC_FLUSH_VAR
   156   return symbol;
   157 }
   159 }}
   161 #endif

mercurial