#pragma once
#include <util/generic/vector.h>
#include <util/memory/blob.h>
#include <util/ysaveload.h>
#include <library/cpp/compproto/huff.h>
namespace NCompTable {
struct TCompressorTable {
ui32 Table[65536];
ui32 HashMul;
NCompProto::TCoderEntry HuffCodes[10];
ui8 HuffIndices[256];
void GetHuffCode(const NCompProto::TCoderEntry& entry, ui32 value, ui64& bitCode, ui8& bitLength) const;
void GetLastHuffCode(ui32 value, ui64& bitCode, ui8& bitLength) const;
void GetHuffCode(ui32 value, ui64& bitCode, ui8& bitLength) const;
ui8 GetHuffIndex(ui8 prefix);
void BuildHuffCodes(i64 totalFreq, i64 freqs[65536]);
bool BuildHuffCodes(i64 totalFreq, i64 freqs[65536], i64 add);
};
struct TDataSampler {
enum {
Size = 1 << 18,
};
ui32 EntryVal[Size];
i64 EntryHit[Size];
i64 Counter;
public:
TDataSampler();
void BuildTable(TCompressorTable& table) const;
void AddStat(ui32 val);
void AddStat(const TStringBuf& stringBuf);
};
class TDataCompressor;
class TDataDecompressor;
class TChunkCompressor {
public:
TChunkCompressor(bool highQuality, const TCompressorTable& table);
void Compress(TStringBuf data, TVector<char>* result) const;
~TChunkCompressor();
private:
bool HighQuality;
THolder<TDataCompressor> Compressor;
};
class TChunkDecompressor {
public:
TChunkDecompressor(bool highQuality, const TCompressorTable& table);
void Decompress(TStringBuf data, TVector<char>* result) const;
~TChunkDecompressor();
private:
bool HighQuality;
THolder<TDataDecompressor> Decompressor;
};
}
template <>
class TSerializer<NCompTable::TCompressorTable> {
public:
static inline void Save(IOutputStream* out, const NCompTable::TCompressorTable& entry) {
SavePodType(out, entry);
}
static inline void Load(IInputStream* in, NCompTable::TCompressorTable& entry) {
LoadPodType(in, entry);
}
};