casacore
Loading...
Searching...
No Matches
Deflate.h
Go to the documentation of this file.
1#ifndef CASACORE_SISCO_DEFLATE_H_
2#define CASACORE_SISCO_DEFLATE_H_
3
4#include <libdeflate.h>
5
6#include <cstddef>
7#include <span>
8#include <stdexcept>
9
11
13 public:
14 Compressor(int compression_level) : compressor_(libdeflate_alloc_compressor(compression_level)) {
15 if (!compressor_)
16 throw std::runtime_error("Could not create compressor: bad settings or out of memory");
17 }
18
19 Compressor(int compression_level, const libdeflate_options& options)
20 : compressor_(libdeflate_alloc_compressor_ex(compression_level, &options)) {
21 if (!compressor_)
22 throw std::runtime_error("Could not create compressor: bad settings or out of memory");
23 }
24
25 ~Compressor() { libdeflate_free_compressor(compressor_); }
26
32 size_t Compress(std::span<const std::byte> input, std::span<std::byte> output) {
33 return libdeflate_deflate_compress(compressor_, input.data(), input.size(), output.data(),
34 output.size());
35 }
36
42 size_t CompressBound(size_t input_size) {
43 return libdeflate_deflate_compress_bound(compressor_, input_size);
44 }
45
46 private:
47 struct libdeflate_compressor* compressor_;
48};
49
51 public:
52 Decompressor() : decompressor_(libdeflate_alloc_decompressor()) {
53 if (!decompressor_)
54 throw std::runtime_error("Could not create decompressor: bad settings or out of memory");
55 }
56
57 Decompressor(const libdeflate_options& options)
58 : decompressor_(libdeflate_alloc_decompressor_ex(&options)) {
59 if (!decompressor_)
60 throw std::runtime_error("Could not create decompressor: bad settings or out of memory");
61 }
62
63 ~Decompressor() { libdeflate_free_decompressor(decompressor_); }
64
65 size_t Decompress(std::span<const std::byte> input, std::span<std::byte> output) {
66 size_t actual_out_nbytes_ret;
67 const libdeflate_result result =
68 libdeflate_deflate_decompress(decompressor_, input.data(), input.size(), output.data(),
69 output.size(), &actual_out_nbytes_ret);
70 switch (result) {
71 case LIBDEFLATE_SUCCESS:
72 break;
73 case LIBDEFLATE_BAD_DATA:
74 throw std::runtime_error("Could not decompress data: bad data");
75 case LIBDEFLATE_SHORT_OUTPUT:
76 throw std::runtime_error("Could not decompress data: data shorter than expected");
77 case LIBDEFLATE_INSUFFICIENT_SPACE:
78 throw std::runtime_error("Could not decompress data: insufficient space in output buffer");
79 }
80 return actual_out_nbytes_ret;
81 }
82
83 private:
84 struct libdeflate_decompressor* decompressor_;
85};
86
87} // namespace casacore::deflate
88
89#endif
size_t Compress(std::span< const std::byte > input, std::span< std::byte > output)
Compresses the input into output.
Definition Deflate.h:32
size_t CompressBound(size_t input_size)
Worst-case upper bound on the number of bytes of compressed data that may be produced by compressing ...
Definition Deflate.h:42
Compressor(int compression_level, const libdeflate_options &options)
Definition Deflate.h:19
struct libdeflate_compressor * compressor_
Definition Deflate.h:47
Compressor(int compression_level)
Definition Deflate.h:14
struct libdeflate_decompressor * decompressor_
Definition Deflate.h:84
size_t Decompress(std::span< const std::byte > input, std::span< std::byte > output)
Definition Deflate.h:65
Decompressor(const libdeflate_options &options)
Definition Deflate.h:57