41class ZstdCodec :
public CompressionCodec {
48 explicit ZstdCodec(
int compression_level = 3)
49 : level_(compression_level) {}
57 [[nodiscard]] expected<std::vector<uint8_t>>
compress(
58 const uint8_t* data,
size_t size)
const override {
60 size_t bound = ZSTD_compressBound(size);
61 std::vector<uint8_t> out(bound);
63 size_t compressed_size = ZSTD_compress(
64 out.data(), out.size(),
68 if (ZSTD_isError(compressed_size)) {
69 return Error{ErrorCode::INTERNAL_ERROR,
70 std::string(
"ZSTD compress failed: ") +
71 ZSTD_getErrorName(compressed_size)};
74 out.resize(compressed_size);
86 [[nodiscard]] expected<std::vector<uint8_t>>
decompress(
87 const uint8_t* data,
size_t size,
88 size_t uncompressed_size)
const override {
90 static constexpr size_t MAX_DECOMPRESS_SIZE = 256 * 1024 * 1024;
91 if (uncompressed_size > MAX_DECOMPRESS_SIZE)
92 return Error{ErrorCode::INVALID_ARGUMENT,
"Decompression size exceeds 256 MB limit"};
94 std::vector<uint8_t> out(uncompressed_size);
96 size_t decompressed_size = ZSTD_decompress(
97 out.data(), out.size(),
100 if (ZSTD_isError(decompressed_size)) {
101 return Error{ErrorCode::CORRUPT_PAGE,
102 std::string(
"ZSTD decompress failed: ") +
103 ZSTD_getErrorName(decompressed_size)};
106 if (decompressed_size != uncompressed_size) {
107 return Error{ErrorCode::CORRUPT_PAGE,
108 "ZSTD: decompressed " +
109 std::to_string(decompressed_size) +
110 " bytes but expected " +
111 std::to_string(uncompressed_size)};
121 [[nodiscard]]
Compression codec_type()
const override {
122 return Compression::ZSTD;
126 [[nodiscard]]
const char* name()
const override {
149inline void register_zstd_codec(
int level = 3) {
void register_codec(std::unique_ptr< CompressionCodec > codec)
Register a codec, transferring ownership to the registry.
static CodecRegistry & instance()
Access the process-wide singleton instance.
Compression codec interface and registry for Signet Forge.
Compression
Parquet compression codecs.
expected< std::vector< uint8_t > > decompress(Compression codec, const uint8_t *data, size_t size, size_t uncompressed_size)
Decompress data using the specified codec via the global CodecRegistry.
expected< std::vector< uint8_t > > compress(Compression codec, const uint8_t *data, size_t size)
Compress data using the specified codec via the global CodecRegistry.