#ifndef _RAR_RS16_ #define _RAR_RS16_ class RSCoder16 { private: static const uint gfSize=65535; // Galois field size. void gfInit(); // Galois field inititalization. inline uint gfAdd(uint a,uint b); // Addition in Galois field. inline uint gfMul(uint a,uint b); // Multiplication in Galois field. inline uint gfInv(uint a); // Inverse element in Galois field. uint *gfExp; // Galois field exponents. uint *gfLog; // Galois field logarithms. void MakeEncoderMatrix(); void MakeDecoderMatrix(); void InvertDecoderMatrix(); #ifdef USE_SSE bool SSE_UpdateECC(uint DataNum, uint ECCNum, const byte *Data, byte *ECC, size_t BlockSize); #endif bool Decoding; // If we are decoding or encoding data. uint ND; // Number of data units. uint NR; // Number of Reed-Solomon code units. uint NE; // Number of erasures. bool *ValidFlags; // Validity flags for data and ECC units. uint *MX; // Cauchy based coding or decoding matrix. uint *DataLog; // Buffer to store data logarithms for UpdateECC. size_t DataLogSize; public: RSCoder16(); ~RSCoder16(); bool Init(uint DataCount, uint RecCount, bool *ValidityFlags); #if 0 // We use only UpdateECC now. void Process(const uint *Data, uint *Out); #endif void UpdateECC(uint DataNum, uint ECCNum, const byte *Data, byte *ECC, size_t BlockSize); }; #endif