Signet Forge 0.1.0
C++20 Parquet library with AI-native extensions
DEMO
Loading...
Searching...
No Matches
zstd.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright 2026 Johnson Ogundeji
3#pragma once
4
20
21#ifdef SIGNET_HAS_ZSTD
22
24
25#include <zstd.h>
26
27#include <cstdint>
28#include <string>
29#include <vector>
30
31namespace signet::forge {
32
41class ZstdCodec : public CompressionCodec {
42public:
48 explicit ZstdCodec(int compression_level = 3)
49 : level_(compression_level) {}
50
57 [[nodiscard]] expected<std::vector<uint8_t>> compress(
58 const uint8_t* data, size_t size) const override {
59
60 size_t bound = ZSTD_compressBound(size);
61 std::vector<uint8_t> out(bound);
62
63 size_t compressed_size = ZSTD_compress(
64 out.data(), out.size(),
65 data, size,
66 level_);
67
68 if (ZSTD_isError(compressed_size)) {
69 return Error{ErrorCode::INTERNAL_ERROR,
70 std::string("ZSTD compress failed: ") +
71 ZSTD_getErrorName(compressed_size)};
72 }
73
74 out.resize(compressed_size);
75 return out;
76 }
77
86 [[nodiscard]] expected<std::vector<uint8_t>> decompress(
87 const uint8_t* data, size_t size,
88 size_t uncompressed_size) const override {
89
90 static constexpr size_t MAX_DECOMPRESS_SIZE = 256 * 1024 * 1024; // 256 MB
91 if (uncompressed_size > MAX_DECOMPRESS_SIZE)
92 return Error{ErrorCode::INVALID_ARGUMENT, "Decompression size exceeds 256 MB limit"};
93
94 std::vector<uint8_t> out(uncompressed_size);
95
96 size_t decompressed_size = ZSTD_decompress(
97 out.data(), out.size(),
98 data, size);
99
100 if (ZSTD_isError(decompressed_size)) {
101 return Error{ErrorCode::CORRUPT_PAGE,
102 std::string("ZSTD decompress failed: ") +
103 ZSTD_getErrorName(decompressed_size)};
104 }
105
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)};
112 }
113
114 return out;
115 }
116
119
121 [[nodiscard]] Compression codec_type() const override {
122 return Compression::ZSTD;
123 }
124
126 [[nodiscard]] const char* name() const override {
127 return "zstd";
128 }
129
131
132private:
134 int level_;
135};
136
137// ===========================================================================
138// Auto-registration helper
139// ===========================================================================
140
149inline void register_zstd_codec(int level = 3) {
150 CodecRegistry::instance().register_codec(std::make_unique<ZstdCodec>(level));
151}
152
153} // namespace signet::forge
154
155#endif // SIGNET_HAS_ZSTD
void register_codec(std::unique_ptr< CompressionCodec > codec)
Register a codec, transferring ownership to the registry.
Definition codec.hpp:105
static CodecRegistry & instance()
Access the process-wide singleton instance.
Definition codec.hpp:94
Compression codec interface and registry for Signet Forge.
Compression
Parquet compression codecs.
Definition types.hpp:115
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.
Definition codec.hpp:213
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.
Definition codec.hpp:183