Upload 2.0.2
[physicsfs] / lzma / CS / 7zip / Compress / LZMA / LzmaBase.cs
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 }