1370b324cSopenharmony_ci// LzmaBase.cs
2370b324cSopenharmony_ci
3370b324cSopenharmony_cinamespace SevenZip.Compression.LZMA
4370b324cSopenharmony_ci{
5370b324cSopenharmony_ci	internal abstract class Base
6370b324cSopenharmony_ci	{
7370b324cSopenharmony_ci		public const uint kNumRepDistances = 4;
8370b324cSopenharmony_ci		public const uint kNumStates = 12;
9370b324cSopenharmony_ci
10370b324cSopenharmony_ci		// static byte []kLiteralNextStates  = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
11370b324cSopenharmony_ci		// static byte []kMatchNextStates    = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
12370b324cSopenharmony_ci		// static byte []kRepNextStates      = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
13370b324cSopenharmony_ci		// static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
14370b324cSopenharmony_ci
15370b324cSopenharmony_ci		public struct State
16370b324cSopenharmony_ci		{
17370b324cSopenharmony_ci			public uint Index;
18370b324cSopenharmony_ci			public void Init() { Index = 0; }
19370b324cSopenharmony_ci			public void UpdateChar()
20370b324cSopenharmony_ci			{
21370b324cSopenharmony_ci				if (Index < 4) Index = 0;
22370b324cSopenharmony_ci				else if (Index < 10) Index -= 3;
23370b324cSopenharmony_ci				else Index -= 6;
24370b324cSopenharmony_ci			}
25370b324cSopenharmony_ci			public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); }
26370b324cSopenharmony_ci			public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); }
27370b324cSopenharmony_ci			public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); }
28370b324cSopenharmony_ci			public bool IsCharState() { return Index < 7; }
29370b324cSopenharmony_ci		}
30370b324cSopenharmony_ci
31370b324cSopenharmony_ci		public const int kNumPosSlotBits = 6;
32370b324cSopenharmony_ci		public const int kDicLogSizeMin = 0;
33370b324cSopenharmony_ci		// public const int kDicLogSizeMax = 30;
34370b324cSopenharmony_ci		// public const uint kDistTableSizeMax = kDicLogSizeMax * 2;
35370b324cSopenharmony_ci
36370b324cSopenharmony_ci		public const int kNumLenToPosStatesBits = 2; // it's for speed optimization
37370b324cSopenharmony_ci		public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
38370b324cSopenharmony_ci
39370b324cSopenharmony_ci		public const uint kMatchMinLen = 2;
40370b324cSopenharmony_ci
41370b324cSopenharmony_ci		public static uint GetLenToPosState(uint len)
42370b324cSopenharmony_ci		{
43370b324cSopenharmony_ci			len -= kMatchMinLen;
44370b324cSopenharmony_ci			if (len < kNumLenToPosStates)
45370b324cSopenharmony_ci				return len;
46370b324cSopenharmony_ci			return (uint)(kNumLenToPosStates - 1);
47370b324cSopenharmony_ci		}
48370b324cSopenharmony_ci
49370b324cSopenharmony_ci		public const int kNumAlignBits = 4;
50370b324cSopenharmony_ci		public const uint kAlignTableSize = 1 << kNumAlignBits;
51370b324cSopenharmony_ci		public const uint kAlignMask = (kAlignTableSize - 1);
52370b324cSopenharmony_ci
53370b324cSopenharmony_ci		public const uint kStartPosModelIndex = 4;
54370b324cSopenharmony_ci		public const uint kEndPosModelIndex = 14;
55370b324cSopenharmony_ci		public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
56370b324cSopenharmony_ci
57370b324cSopenharmony_ci		public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2);
58370b324cSopenharmony_ci
59370b324cSopenharmony_ci		public const uint kNumLitPosStatesBitsEncodingMax = 4;
60370b324cSopenharmony_ci		public const uint kNumLitContextBitsMax = 8;
61370b324cSopenharmony_ci
62370b324cSopenharmony_ci		public const int kNumPosStatesBitsMax = 4;
63370b324cSopenharmony_ci		public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
64370b324cSopenharmony_ci		public const int kNumPosStatesBitsEncodingMax = 4;
65370b324cSopenharmony_ci		public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
66370b324cSopenharmony_ci
67370b324cSopenharmony_ci		public const int kNumLowLenBits = 3;
68370b324cSopenharmony_ci		public const int kNumMidLenBits = 3;
69370b324cSopenharmony_ci		public const int kNumHighLenBits = 8;
70370b324cSopenharmony_ci		public const uint kNumLowLenSymbols = 1 << kNumLowLenBits;
71370b324cSopenharmony_ci		public const uint kNumMidLenSymbols = 1 << kNumMidLenBits;
72370b324cSopenharmony_ci		public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
73370b324cSopenharmony_ci				(1 << kNumHighLenBits);
74370b324cSopenharmony_ci		public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
75370b324cSopenharmony_ci	}
76370b324cSopenharmony_ci}
77