// Base.java

package SevenZip.Compression.LZMA;

public class Base
{
	public static final int kNumRepDistances = 4;
	public static final int kNumStates = 12;
	
	public static final int StateInit()
	{
		return 0;
	}
	
	public static final int StateUpdateChar(int index)
	{
		if (index < 4) 
			return 0;
		if (index < 10) 
			return index - 3;
		return index - 6;
	}
	
	public static final int StateUpdateMatch(int index)
	{
		return (index < 7 ? 7 : 10); 
	}

	public static final int StateUpdateRep(int index)
	{ 
		return (index < 7 ? 8 : 11); 
	}
	
	public static final int StateUpdateShortRep(int index)
	{ 
		return (index < 7 ? 9 : 11); 
	}

	public static final boolean StateIsCharState(int index)
	{ 
		return index < 7; 
	}
	
	public static final int kNumPosSlotBits = 6;
	public static final int kDicLogSizeMin = 0;
	// public static final int kDicLogSizeMax = 28;
	// public static final int kDistTableSizeMax = kDicLogSizeMax * 2;
	
	public static final int kNumLenToPosStatesBits = 2; // it's for speed optimization
	public static final int kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
	
	public static final int kMatchMinLen = 2;
	
	public static final int GetLenToPosState(int len)
	{
		len -= kMatchMinLen;
		if (len < kNumLenToPosStates)
			return len;
		return (int)(kNumLenToPosStates - 1);
	}
	
	public static final int kNumAlignBits = 4;
	public static final int kAlignTableSize = 1 << kNumAlignBits;
	public static final int kAlignMask = (kAlignTableSize - 1);
	
	public static final int kStartPosModelIndex = 4;
	public static final int kEndPosModelIndex = 14;
	public static final int kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
	
	public static final  int kNumFullDistances = 1 << (kEndPosModelIndex / 2);
	
	public static final  int kNumLitPosStatesBitsEncodingMax = 4;
	public static final  int kNumLitContextBitsMax = 8;
	
	public static final  int kNumPosStatesBitsMax = 4;
	public static final  int kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
	public static final  int kNumPosStatesBitsEncodingMax = 4;
	public static final  int kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
	
	public static final  int kNumLowLenBits = 3;
	public static final  int kNumMidLenBits = 3;
	public static final  int kNumHighLenBits = 8;
	public static final  int kNumLowLenSymbols = 1 << kNumLowLenBits;
	public static final  int kNumMidLenSymbols = 1 << kNumMidLenBits;
	public static final  int kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
			(1 << kNumHighLenBits);
	public static final  int kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
}
