www.pudn.com > Compression.rar > Arithmetic.h
#ifndef __ARITHMETIC_H
#define __ARITHMETIC_H
#include "Gendef.h"
class CArithmetic
{
private:
DWORD let[256]; // array of probabilities for every leter
DWORD acc[256]; // array of accumulative probabilities (acc[0] = 0)
DWORD sum; // sum of contence in array let or acc[255]+let[255]
long underflow; // counter for underflow - bits
DWORD msb; // msb for BITS_CODE bits number
DWORD msb2; // msb for (BITS_CODE-1) bits number
DWORD filler; // mask with BITS_CODE one`s
private:
// source can`t be more then 2^28 bytes (2^28 = 268435456)
inline BYTE bitin(void *source, long &soffset);
inline void bitout(void *target, long &toffset, BYTE source);
void InitAll(BYTE filler);
int InitLet(BYTE *source, long length);
inline void UpdateAccByLet();
inline BYTE FindInRange(DWORD start, DWORD end, DWORD point);
inline DWORD GetStartPoint(DWORD start, DWORD end, BYTE leter);
inline DWORD GetEndPoint(DWORD start, DWORD end, BYTE leter);
void FlashEncoder(DWORD code, BYTE *target, long &toffset);
void LoadTable(BYTE *source, long &offset);
void SaveTable(BYTE *target, long &offset);
DWORD LoadFirstCode(BYTE *source, long &offset);
long EncodeOnce(DWORD &start, DWORD &end, BYTE *target, long &toffset, BYTE source);
long DecodeOnce(DWORD &start, DWORD &end, BYTE *target, BYTE *source, long &soffset, DWORD &code);
public:
CArithmetic();
virtual ~CArithmetic();
void Encode(BYTE *target, long &tlen, BYTE *source, long slen);
long Decode(BYTE *target, long &tlen, BYTE *source, long slen);
long GetMaxEncoded(long len);
long GetMaxDecoded(BYTE *source);
virtual void OnStep() = 0;
};
#endif