struct FileCompressor
{
std::vector<unsigned char> data;
std::vector<unsigned char> src;
unsigned int compressed;
unsigned int decompressed;
unsigned int hash;
FileCompressor()
{
data.resize(FILE_COMPRESSOR_MEM);
src.resize(FILE_COMPRESSOR_MEM);
}
bool operator()(const std::string& source)
{
compressed = 0;
decompressed = 0;
hash = 0;
std::ifstream input(source.c_str(), std::ifstream::binary | std::ifstream::in);
bool r = false;
if (input)
{
input.seekg(0, std::ifstream::end);
decompressed = input.tellg();
input.seekg(0, std::ifstream::beg);
input.read(reinterpret_cast<char*>(&src[0]), MIN(src.size(), decompressed));
input.close();
hash = XXH32(reinterpret_cast<char*>(&src[0]), decompressed, FOXFS_MAGIC);
// LZ4_compress_HC kullanıldı
if ((compressed = LZ4_compress_HC(reinterpret_cast<char*>(&src[0]), reinterpret_cast<char*>(&data[0]), decompressed, data.size(), 9)) >= decompressed)
{
// Eğer sıkıştırma oranı düşerse, veriyi kopyala (özellikle sıkıştırma başarısız olursa)
memcpy(&data[0], &src[0], src.size());
compressed = decompressed;
}
r = true;
}
return r;
}
};