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)
15 : compressor_(libdeflate_alloc_compressor(compression_level)) {
16 if (!compressor_)
17 throw std::runtime_error(
18 "Could not create compressor: bad settings or out of memory");
19 }
20
21 Compressor(int compression_level, const libdeflate_options& options)
23 libdeflate_alloc_compressor_ex(compression_level, &options)) {
24 if (!compressor_)
25 throw std::runtime_error(
26 "Could not create compressor: bad settings or out of memory");
27 }
28
29 ~Compressor() { libdeflate_free_compressor(compressor_); }
30
36 size_t Compress(std::span<const std::byte> input,
37 std::span<std::byte> output) {
38 return libdeflate_deflate_compress(compressor_, input.data(), input.size(),
39 output.data(), output.size());
40 }
41
47 size_t CompressBound(size_t input_size) {
48 return libdeflate_deflate_compress_bound(compressor_, input_size);
49 }
50
51 private:
52 struct libdeflate_compressor* compressor_;
53};
54
56 public:
57 Decompressor() : decompressor_(libdeflate_alloc_decompressor()) {
58 if (!decompressor_)
59 throw std::runtime_error(
60 "Could not create decompressor: bad settings or out of memory");
61 }
62
63 Decompressor(const libdeflate_options& options)
64 : decompressor_(libdeflate_alloc_decompressor_ex(&options)) {
65 if (!decompressor_)
66 throw std::runtime_error(
67 "Could not create decompressor: bad settings or out of memory");
68 }
69
70 ~Decompressor() { libdeflate_free_decompressor(decompressor_); }
71
72 size_t Decompress(std::span<const std::byte> input,
73 std::span<std::byte> output) {
74 size_t actual_out_nbytes_ret;
75 const libdeflate_result result = libdeflate_deflate_decompress(
76 decompressor_, input.data(), input.size(), output.data(), output.size(),
77 &actual_out_nbytes_ret);
78 switch (result) {
79 case LIBDEFLATE_SUCCESS:
80 break;
81 case LIBDEFLATE_BAD_DATA:
82 throw std::runtime_error("Could not decompress data: bad data");
83 case LIBDEFLATE_SHORT_OUTPUT:
84 throw std::runtime_error(
85 "Could not decompress data: data shorter than expected");
86 case LIBDEFLATE_INSUFFICIENT_SPACE:
87 throw std::runtime_error(
88 "Could not decompress data: insufficient space in output buffer");
89 }
90 return actual_out_nbytes_ret;
91 }
92
93 private:
94 struct libdeflate_decompressor* decompressor_;
95};
96
97} // namespace casacore::deflate
98
99#endif
size_t Compress(std::span< const std::byte > input, std::span< std::byte > output)
Compresses the input into output.
Definition Deflate.h:36
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:47
Compressor(int compression_level, const libdeflate_options &options)
Definition Deflate.h:21
struct libdeflate_compressor * compressor_
Definition Deflate.h:52
Compressor(int compression_level)
Definition Deflate.h:14
struct libdeflate_decompressor * decompressor_
Definition Deflate.h:94
size_t Decompress(std::span< const std::byte > input, std::span< std::byte > output)
Definition Deflate.h:72
Decompressor(const libdeflate_options &options)
Definition Deflate.h:63