d074cc7c07
Plugin: ns7zip v2.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: LGPL-2.1-or-later
61 lines
1.4 KiB
C++
61 lines
1.4 KiB
C++
// 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
|