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;
InitSevenZip.Compression.LZMA.Base.State18 			public void Init() { Index = 0; }
UpdateCharSevenZip.Compression.LZMA.Base.State19 			public void UpdateChar()
20 			{
21 				if (Index < 4) Index = 0;
22 				else if (Index < 10) Index -= 3;
23 				else Index -= 6;
24 			}
UpdateMatchSevenZip.Compression.LZMA.Base.State25 			public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); }
UpdateRepSevenZip.Compression.LZMA.Base.State26 			public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); }
UpdateShortRepSevenZip.Compression.LZMA.Base.State27 			public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); }
IsCharStateSevenZip.Compression.LZMA.Base.State28 			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 
GetLenToPosState(uint len)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 }
77