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