#region Using #endregion namespace SharpCompress.Compressors.PPMd.I1 { /// /// SEE2 (secondary escape estimation) contexts for PPM contexts with masked symbols. /// /// /// /// This must be a class rather than a structure because MakeEscapeFrequency returns a See2Context /// instance from the see2Contexts array. The caller (for example, EncodeSymbol2) then updates the /// returned See2Context instance and expects the updates to be reflected in the see2Contexts array. /// This would not happen if this were a structure. /// /// /// Note that in most cases fields are used rather than properties for performance reasons (for example, /// is a field rather than a property). /// /// internal class See2Context { private const byte PERIOD_BIT_COUNT = 7; public ushort _summary; public byte _shift; public byte _count; public void Initialize(uint initialValue) { _shift = PERIOD_BIT_COUNT - 4; _summary = (ushort)(initialValue << _shift); _count = 7; } public uint Mean() { uint value = (uint)(_summary >> _shift); _summary = (ushort)(_summary - value); return (uint)(value + ((value == 0) ? 1 : 0)); } public void Update() { if (_shift < PERIOD_BIT_COUNT && --_count == 0) { _summary += _summary; _count = (byte)(3 << _shift++); } } } }