/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/util/compression.cpp
81 строка
3 KB
Андрей Смычков
feat: util varint, crc32c, murmur3, compression (snappy)
25 апр 2026, 09:00
25 апр 2026, 09:00
a7cf584
Код
Авторство
О чём код?
#include "compression.hpp" #ifdef HAVE_SNAPPY #include <snappy.h> #endif namespace sstorage { namespace util { //============================================================================ // Проверка наличия Snappy в сборке //============================================================================ bool snappyAvailable() { #ifdef HAVE_SNAPPY return true; #else return false; #endif } //============================================================================ // Сжатие //============================================================================ // Если Snappy недоступен или тип = kNone — просто копируем bytes в output. // Это сохраняет совместимость API вне зависимости от наличия библиотеки. //============================================================================ CompressionType compress(const char* input, size_t inputLen, std::string& output, CompressionType type) { output.clear(); if (type == CompressionType::kNone) { output.assign(input, inputLen); return CompressionType::kNone; } #ifdef HAVE_SNAPPY if (type == CompressionType::kSnappy) { // Snappy возвращает максимально возможный размер сжатого буфера, // резервируем место и сжимаем size_t outLen; output.resize(snappy::MaxCompressedLength(inputLen)); snappy::RawCompress(input, inputLen, output.data(), &outLen); output.resize(outLen); // Если сжатие не дало выигрыша — возвращаем несжатое (экономия CPU при decompress) if (outLen >= inputLen) { output.assign(input, inputLen); return CompressionType::kNone; } return CompressionType::kSnappy; } #endif // fallback: kNone output.assign(input, inputLen); return CompressionType::kNone; } //============================================================================ // Разжатие //============================================================================ bool decompress(const char* input, size_t inputLen, std::string& output, CompressionType type) { output.clear(); if (type == CompressionType::kNone) { output.assign(input, inputLen); return true; } #ifdef HAVE_SNAPPY if (type == CompressionType::kSnappy) { size_t uncompressedLen; if (!snappy::GetUncompressedLength(input, inputLen, &uncompressedLen)) { return false; } output.resize(uncompressedLen); return snappy::RawUncompress(input, inputLen, output.data()); } #endif // Snappy-данные на non-snappy сборке — не можем декодировать return false; } } }