sandbox
Loading...
Searching...
No Matches
compression.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_UTILITY_COMPRESSION_HPP_
3#define LIBSBX_UTILITY_COMPRESSION_HPP_
4
5#include <span>
6#include <vector>
7#include <stdexcept>
8#include <cstdint>
9#include <cstring>
10
11namespace sbx::utility {
12
13struct compression_error : public std::runtime_error {
14 explicit compression_error(std::string_view message)
15 : std::runtime_error{std::string{message}} { }
16}; // struct compression_error
17
18struct decompression_error : public std::runtime_error {
19 explicit decompression_error(std::string_view message)
20 : std::runtime_error{std::string{message}} { }
21}; // struct decompression_error
22
23enum class compression_type : std::uint8_t {
24 lz4 = 0,
25 zstd = 1
26}; // enum class compression_type
27
28template<compression_type Type>
30 [[nodiscard]] static auto compress(std::span<const char> input) -> std::vector<char>;
31 static auto decompress(std::span<const char> input, std::span<char> output) -> void;
32}; // struct basic_compressor
33
34template<>
35struct basic_compressor<compression_type::lz4> {
36 [[nodiscard]] static auto compress(std::span<const char> input) -> std::vector<char>;
37 static auto decompress(std::span<const char> input, std::span<char> output) -> void;
38}; // struct basic_compressor
39
40template<>
41struct basic_compressor<compression_type::zstd> {
42 [[nodiscard]] static auto compress(std::span<const char> input) -> std::vector<char>;
43 static auto decompress(std::span<const char> input, std::span<char> output) -> void;
44}; // struct basic_compressor
45
48
49template<typename Type, compression_type CompressionType = compression_type::lz4>
50auto compress(std::span<const Type> input) -> std::vector<char> {
51 return basic_compressor<CompressionType>::compress({reinterpret_cast<const char*>(input.data()), input.size() * sizeof(Type)});
52}
53
54template<typename Type, compression_type CompressionType = compression_type::lz4>
55auto decompress(std::span<const char> input, const std::size_t original_size) -> std::vector<Type> {
56 auto output = std::vector<Type>(original_size);
57
58 basic_compressor<CompressionType>::decompress(input, {reinterpret_cast<char*>(output.data()), original_size * sizeof(Type)});
59
60 return output;
61}
62
63} // namespace sbx::utility
64
65#endif // LIBSBX_UTILITY_COMPRESSION_HPP_
Definition: compression.hpp:29
Definition: compression.hpp:13
Definition: compression.hpp:18