blob: fd5baea70db87d7e1d0ff030711d06f4cdbfbbe1 [file]
// 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