misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaBase.cs
changeset 13904 99b265e0d1d0
parent 13903 5f819b90d479
child 13905 b172a5d40eee
equal deleted inserted replaced
13903:5f819b90d479 13904:99b265e0d1d0
     1 // LzmaBase.cs
       
     2 
       
     3 namespace SevenZip.Compression.LZMA
       
     4 {
       
     5 	internal abstract class Base
       
     6 	{
       
     7 		public const uint kNumRepDistances = 4;
       
     8 		public const uint kNumStates = 12;
       
     9 
       
    10 		// static byte []kLiteralNextStates  = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
       
    11 		// static byte []kMatchNextStates    = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
       
    12 		// static byte []kRepNextStates      = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
       
    13 		// static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
       
    14 
       
    15 		public struct State
       
    16 		{
       
    17 			public uint Index;
       
    18 			public void Init() { Index = 0; }
       
    19 			public void UpdateChar()
       
    20 			{
       
    21 				if (Index < 4) Index = 0;
       
    22 				else if (Index < 10) Index -= 3;
       
    23 				else Index -= 6;
       
    24 			}
       
    25 			public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); }
       
    26 			public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); }
       
    27 			public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); }
       
    28 			public bool IsCharState() { return Index < 7; }
       
    29 		}
       
    30 
       
    31 		public const int kNumPosSlotBits = 6;
       
    32 		public const int kDicLogSizeMin = 0;
       
    33 		// public const int kDicLogSizeMax = 30;
       
    34 		// public const uint kDistTableSizeMax = kDicLogSizeMax * 2;
       
    35 
       
    36 		public const int kNumLenToPosStatesBits = 2; // it's for speed optimization
       
    37 		public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
       
    38 
       
    39 		public const uint kMatchMinLen = 2;
       
    40 
       
    41 		public static uint GetLenToPosState(uint len)
       
    42 		{
       
    43 			len -= kMatchMinLen;
       
    44 			if (len < kNumLenToPosStates)
       
    45 				return len;
       
    46 			return (uint)(kNumLenToPosStates - 1);
       
    47 		}
       
    48 
       
    49 		public const int kNumAlignBits = 4;
       
    50 		public const uint kAlignTableSize = 1 << kNumAlignBits;
       
    51 		public const uint kAlignMask = (kAlignTableSize - 1);
       
    52 
       
    53 		public const uint kStartPosModelIndex = 4;
       
    54 		public const uint kEndPosModelIndex = 14;
       
    55 		public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
       
    56 
       
    57 		public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2);
       
    58 
       
    59 		public const uint kNumLitPosStatesBitsEncodingMax = 4;
       
    60 		public const uint kNumLitContextBitsMax = 8;
       
    61 
       
    62 		public const int kNumPosStatesBitsMax = 4;
       
    63 		public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
       
    64 		public const int kNumPosStatesBitsEncodingMax = 4;
       
    65 		public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
       
    66 
       
    67 		public const int kNumLowLenBits = 3;
       
    68 		public const int kNumMidLenBits = 3;
       
    69 		public const int kNumHighLenBits = 8;
       
    70 		public const uint kNumLowLenSymbols = 1 << kNumLowLenBits;
       
    71 		public const uint kNumMidLenSymbols = 1 << kNumMidLenBits;
       
    72 		public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
       
    73 				(1 << kNumHighLenBits);
       
    74 		public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
       
    75 	}
       
    76 }