aboutsummaryrefslogtreecommitdiff
path: root/lib/compressionctx.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compressionctx.h')
-rw-r--r--lib/compressionctx.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/compressionctx.h b/lib/compressionctx.h
new file mode 100644
index 0000000..2f3946a
--- /dev/null
+++ b/lib/compressionctx.h
@@ -0,0 +1,40 @@
+#include <span>
+#include <vector>
+
+#pragma once
+
+namespace embed
+{
+
+enum Compression {
+ None,
+ Zstd
+};
+
+class CompressionCtx
+{
+public:
+ virtual ~CompressionCtx() = default;
+ [[nodiscard]] virtual std::vector<uint8_t> decompress(const std::span<const uint8_t> &entry) const = 0;
+};
+
+class ZstdCompressionCtx final : public CompressionCtx
+{
+public:
+ ZstdCompressionCtx(const std::span<const uint8_t> &dictionary);
+ ~ZstdCompressionCtx();
+ [[nodiscard]] std::vector<uint8_t> decompress(const std::span<const uint8_t> &entry) const override;
+};
+
+std::unique_ptr<CompressionCtx> make_compression_ctx(const Compression algo, const std::span<const uint8_t> &dict)
+{
+ switch(algo)
+ {
+ case None:
+ return nullptr;
+ case Zstd:
+ return std::make_unique<ZstdCompressionCtx>(dict);
+ }
+}
+
+} // namespace embed