// QuantumDecoder.h #ifndef ZIP7_INC_COMPRESS_QUANTUM_DECODER_H #define ZIP7_INC_COMPRESS_QUANTUM_DECODER_H #include "../../Common/MyTypes.h" namespace NCompress { namespace NQuantum { const unsigned kNumLitSelectorBits = 2; const unsigned kNumLitSelectors = 1 << kNumLitSelectorBits; const unsigned kNumLitSymbols = 1 << (8 - kNumLitSelectorBits); const unsigned kNumMatchSelectors = 3; const unsigned kNumSelectors = kNumLitSelectors + kNumMatchSelectors; const unsigned kNumSymbolsMax = kNumLitSymbols; // 64 class CRangeDecoder; class CModelDecoder { unsigned NumItems; unsigned ReorderCount; Byte Vals[kNumSymbolsMax]; UInt16 Freqs[kNumSymbolsMax + 1]; public: Byte _pad[64 - 10]; // for structure size alignment void Init(unsigned numItems, unsigned startVal); unsigned Decode(CRangeDecoder *rc); }; class CDecoder { UInt32 _winSize; UInt32 _winPos; UInt32 _winSize_allocated; bool _overWin; Byte *_win; unsigned _numDictBits; CModelDecoder m_Selector; CModelDecoder m_Literals[kNumLitSelectors]; CModelDecoder m_PosSlot[kNumMatchSelectors]; CModelDecoder m_LenSlot; void Init(); HRESULT CodeSpec(const Byte *inData, size_t inSize, UInt32 outSize); public: HRESULT Code(const Byte *inData, size_t inSize, UInt32 outSize, bool keepHistory); HRESULT SetParams(unsigned numDictBits); CDecoder(): _win(NULL), _numDictBits(0) {} const Byte * GetDataPtr() const { return _win + _winPos; } }; }} #endif