mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-14 10:11:38 -06:00
4.20
This commit is contained in:
committed by
Kornel Lesiński
parent
8c1b5c7b7e
commit
3c510ba80b
@@ -1,108 +1,55 @@
|
||||
// HC.h
|
||||
|
||||
// #pragma once
|
||||
|
||||
// #ifndef __HC_H
|
||||
// #define __HC_H
|
||||
|
||||
#include "../LZInWindow.h"
|
||||
#include "Common/Types.h"
|
||||
#include "Windows/Defs.h"
|
||||
#include "../IMatchFinder.h"
|
||||
|
||||
namespace HC_NAMESPACE {
|
||||
|
||||
typedef UInt32 CIndex;
|
||||
const UInt32 kMaxValForNormalize = (UInt32(1) << 31) - 1;
|
||||
|
||||
// #define __USE_3_BYTES
|
||||
|
||||
#ifdef __USE_3_BYTES
|
||||
|
||||
#pragma pack(push, PragmaBinTree)
|
||||
#pragma pack(push, 1)
|
||||
|
||||
struct CIndex
|
||||
class CMatchFinderHC:
|
||||
public IMatchFinder,
|
||||
public IMatchFinderSetCallback,
|
||||
public CLZInWindow,
|
||||
public CMyUnknownImp
|
||||
{
|
||||
BYTE Data[3];
|
||||
CIndex(){}
|
||||
CIndex(UINT32 aValue)
|
||||
{
|
||||
Data[0] = aValue & 0xFF;
|
||||
Data[1] = (aValue >> 8) & 0xFF;
|
||||
Data[2] = (aValue >> 16) & 0xFF;
|
||||
}
|
||||
operator UINT32() const { return (*((const UINT32 *)Data)) & 0xFFFFFF; }
|
||||
};
|
||||
const UINT32 kMaxValForNormalize = CIndex(-1);
|
||||
|
||||
#pragma pack(pop)
|
||||
#pragma pack(pop, PragmaBinTree)
|
||||
|
||||
#else
|
||||
|
||||
typedef UINT32 CIndex;
|
||||
const UINT32 kMaxValForNormalize = (UINT32(1) << 31) - 1;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// #define HASH_ARRAY_2
|
||||
|
||||
// #ifdef HASH_ARRAY_2
|
||||
|
||||
// #define HASH_ARRAY_3
|
||||
|
||||
// #else
|
||||
|
||||
// #define HASH_ZIP
|
||||
|
||||
// #endif
|
||||
|
||||
class CInTree: public CLZInWindow
|
||||
{
|
||||
UINT32 _cyclicBufferPos;
|
||||
UINT32 _cyclicBufferSize;
|
||||
|
||||
UINT32 _historySize;
|
||||
UINT32 _matchMaxLen;
|
||||
|
||||
UInt32 _cyclicBufferPos;
|
||||
UInt32 _cyclicBufferSize; // it must be historySize + 1
|
||||
UInt32 _matchMaxLen;
|
||||
CIndex *_hash;
|
||||
|
||||
#ifdef HASH_ARRAY_2
|
||||
CIndex *_hash2;
|
||||
#ifdef HASH_ARRAY_3
|
||||
CIndex *_hash3;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
CIndex *_chain;
|
||||
UInt32 _cutValue;
|
||||
|
||||
UINT32 _cutValue;
|
||||
CMyComPtr<IMatchFinderCallback> m_Callback;
|
||||
|
||||
void NormalizeLinks(CIndex *anArray, UINT32 aNumItems, UINT32 aSubValue);
|
||||
void Normalize();
|
||||
void FreeThisClassMemory();
|
||||
void FreeMemory();
|
||||
|
||||
MY_UNKNOWN_IMP1(IMatchFinderSetCallback)
|
||||
|
||||
STDMETHOD(Init)(ISequentialInStream *inStream);
|
||||
STDMETHOD_(void, ReleaseStream)();
|
||||
STDMETHOD(MovePos)();
|
||||
STDMETHOD_(Byte, GetIndexByte)(Int32 index);
|
||||
STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 back, UInt32 limit);
|
||||
STDMETHOD_(UInt32, GetNumAvailableBytes)();
|
||||
STDMETHOD_(const Byte *, GetPointerToCurrentPos)();
|
||||
STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore,
|
||||
UInt32 matchMaxLen, UInt32 keepAddBufferAfter);
|
||||
STDMETHOD_(UInt32, GetLongestMatch)(UInt32 *distances);
|
||||
STDMETHOD_(void, DummyLongestMatch)();
|
||||
|
||||
// IMatchFinderSetCallback
|
||||
STDMETHOD(SetCallback)(IMatchFinderCallback *callback);
|
||||
|
||||
virtual void BeforeMoveBlock();
|
||||
virtual void AfterMoveBlock();
|
||||
|
||||
public:
|
||||
CInTree();
|
||||
~CInTree();
|
||||
HRESULT Create(UINT32 aSizeHistory, UINT32 aKeepAddBufferBefore, UINT32 aMatchMaxLen,
|
||||
UINT32 aKeepAddBufferAfter, UINT32 _dwSizeReserv = (1<<17));
|
||||
HRESULT Init(ISequentialInStream *aStream);
|
||||
void SetCutValue(UINT32 aCutValue) { _cutValue = aCutValue; }
|
||||
UINT32 GetLongestMatch(UINT32 *aDistances);
|
||||
void DummyLongestMatch();
|
||||
HRESULT MovePos()
|
||||
{
|
||||
_cyclicBufferPos++;
|
||||
if (_cyclicBufferPos >= _cyclicBufferSize)
|
||||
_cyclicBufferPos = 0;
|
||||
RINOK(CLZInWindow::MovePos());
|
||||
if (_pos == kMaxValForNormalize)
|
||||
Normalize();
|
||||
return S_OK;
|
||||
}
|
||||
CMatchFinderHC();
|
||||
virtual ~CMatchFinderHC();
|
||||
void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// #endif
|
||||
|
||||
Reference in New Issue
Block a user