NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
zlib_compress.hpp
浏览该文件的文档.
1#ifndef NEFORCE_COMPRESS_ZLIB_COMPRESS_HPP__
2#define NEFORCE_COMPRESS_ZLIB_COMPRESS_HPP__
3
12
13#ifdef NEFORCE_SUPPORT_ZLIB
14# include <zlib.h>
17NEFORCE_BEGIN_NAMESPACE__
18
24
31struct zlib_exception final : thirdparty_exception {
32 explicit zlib_exception(const char* info = "Zlib Operation Failed.", int code = 0) noexcept :
33 thirdparty_exception(info),
34 code_(code) {}
35
36 explicit zlib_exception(const exception& e) :
37 thirdparty_exception(e) {}
38
39 ~zlib_exception() override = default;
40
41 NEFORCE_NODISCARD const char* type() const noexcept override { return "zlib_exception"; }
42
43private:
44 int code_{0};
45};
46 // Exceptions
48
54
61enum class compress_level : int8_t {
62 none = Z_NO_COMPRESSION,
63 best_speed = Z_BEST_SPEED,
64 default_level = Z_DEFAULT_COMPRESSION,
65 best_compression = Z_BEST_COMPRESSION
66};
67
75 default_strategy = Z_DEFAULT_STRATEGY,
76 filtered = Z_FILTERED,
77 huffman_only = Z_HUFFMAN_ONLY,
78 rle = Z_RLE,
79 fixed = Z_FIXED
80};
81
93
94
102class NEFORCE_API zlib_compressor {
103private:
104 struct compressor_stream_deleter {
105 void operator()(::z_stream* s) const noexcept {
106 if (s != nullptr) {
107 if (s->state != nullptr) {
108 ::deflateEnd(s);
109 }
110 delete s;
111 }
112 }
113 };
114
115 struct decompressor_stream_deleter {
116 void operator()(::z_stream* s) const noexcept {
117 if (s != nullptr) {
118 if (s->state != nullptr) {
119 ::inflateEnd(s);
120 }
121 delete s;
122 }
123 }
124 };
125
136 NEFORCE_NODISCARD static byte_vector compress_data(const byte_t* data, size_t size, compress_level level,
138
150 NEFORCE_NODISCARD static byte_vector decompress_data(byte_t* data, size_t size, size_t estimated_original_size,
152
153public:
167 template <typename Iterator>
168 NEFORCE_NODISCARD static byte_vector
172 static_assert(is_ranges_cot_iter_v<Iterator>, "Iterator must be contiguous_iterator");
173 static_assert(sizeof(iter_value_t<Iterator>) == 1, "Iterator must point to byte-sized elements");
174
175 const auto* data = reinterpret_cast<const byte_t*>(&*begin);
176 const size_t data_size = _NEFORCE distance(begin, end);
177 return compress_data(data, data_size, level, strategy, format);
178 }
179
189 NEFORCE_NODISCARD static byte_vector
193
194 return compress_data(reinterpret_cast<const byte_t*>(data.data()), data.size(), level, strategy, format);
195 }
196
209 template <typename T>
210 NEFORCE_NODISCARD static byte_vector
214 static_assert(sizeof(T) == 1, "Vector must contain byte-sized elements");
215
216 return zlib_compressor::compress_data(reinterpret_cast<const byte_t*>(data.data()), data.size() * sizeof(T),
217 level, strategy, format);
218 }
219
230 template <typename Iterator>
231 NEFORCE_NODISCARD static byte_vector decompress(Iterator begin, Iterator end,
232 const size_t estimated_original_size = 0,
234
235 static_assert(is_ranges_cot_iter_v<Iterator>, "Iterator must be contiguous_iterator");
236 static_assert(sizeof(iter_value_t<Iterator>) == 1, "Iterator must point to byte-sized elements");
237
238 auto* data = reinterpret_cast<byte_t*>(&*begin);
239 const size_t data_size = _NEFORCE distance(begin, end);
240
241 return decompress_data(data, data_size, estimated_original_size, format);
242 }
243
252 NEFORCE_NODISCARD static byte_vector decompress(const byte_view& data, const size_t estimated_original_size = 0,
254 return decompress_data(data.data(), data.size(), estimated_original_size, format);
255 }
256
264 class NEFORCE_API stream_compressor {
265 private:
267
268 bool initialized_ = false;
269 size_t bytes_input_ = 0;
270 size_t bytes_output_ = 0;
271
272 public:
283
288
289 stream_compressor(const stream_compressor&) = delete;
290 stream_compressor& operator=(const stream_compressor&) = delete;
291
297
304
313
322
329
340
348
353 NEFORCE_NODISCARD size_t bytes_input() const noexcept { return bytes_input_; }
354
359 NEFORCE_NODISCARD size_t bytes_output() const noexcept { return bytes_output_; }
360
365 NEFORCE_NODISCARD double compression_ratio() const noexcept {
366 return bytes_input_ > 0 ? static_cast<double>(bytes_output_) / static_cast<double>(bytes_input_) : 0.0;
367 }
368 };
369
377 class NEFORCE_API stream_decompressor {
378 private:
380
381 bool initialized_ = false;
382 size_t bytes_input_ = 0;
383 size_t bytes_output_ = 0;
384
385 public:
392
397
399 stream_decompressor& operator=(const stream_decompressor&) = delete;
400
406
413
422
429
436
444
449 NEFORCE_NODISCARD size_t bytes_input() const noexcept { return bytes_input_; }
450
455 NEFORCE_NODISCARD size_t bytes_output() const noexcept { return bytes_output_; }
456
461 NEFORCE_NODISCARD double expansion_ratio() const noexcept {
462 return bytes_input_ > 0 ? static_cast<double>(bytes_output_) / static_cast<double>(bytes_input_) : 0.0;
463 }
464 };
465};
466 // Compression
468
469NEFORCE_END_NAMESPACE__
470#endif
471#endif // NEFORCE_COMPRESS_ZLIB_COMPRESS_HPP__
独占智能指针
动态大小数组容器
stream_compressor(compress_level level=compress_level::default_level, compress_strategy strategy=compress_strategy::default_strategy, compress_format format=compress_format::zlib)
构造函数
byte_vector compress(string_view data, bool finish=false)
压缩字符串视图
size_t bytes_output() const noexcept
获取输出字节数
size_t bytes_input() const noexcept
获取输入字节数
stream_compressor(stream_compressor &&other) noexcept
移动构造函数
stream_compressor & operator=(stream_compressor &&other) noexcept
移动赋值运算符
byte_vector finish()
完成压缩并返回剩余数据
void reset(compress_level level=compress_level::default_level, compress_strategy strategy=compress_strategy::default_strategy, compress_format format=compress_format::zlib)
重置压缩器状态
double compression_ratio() const noexcept
获取压缩率
byte_vector compress(const cbyte_view &data, bool finish=false)
压缩数据
size_t bytes_input() const noexcept
获取输入字节数
void soft_reset()
软重置解压缩器
stream_decompressor(stream_decompressor &&other) noexcept
移动构造函数
stream_decompressor(compress_format format=compress_format::zlib)
构造函数
size_t bytes_output() const noexcept
获取输出字节数
byte_vector finish()
完成解压缩并返回剩余数据
byte_vector decompress(const byte_view &data, bool finish=false)
解压缩数据
stream_decompressor & operator=(stream_decompressor &&other) noexcept
移动赋值运算符
double expansion_ratio() const noexcept
获取扩展率
void reset(compress_format format=compress_format::zlib)
重置解压缩器状态
ZLib压缩解压缩工具类
static byte_vector decompress(const byte_view &data, const size_t estimated_original_size=0, const compress_format format=compress_format::zlib)
解压缩常量字节视图
static byte_vector compress(Iterator begin, Iterator end, const compress_level level=compress_level::default_level, const compress_strategy strategy=compress_strategy::default_strategy, const compress_format format=compress_format::zlib)
压缩迭代器范围中的数据
static byte_vector compress(const vector< T > &data, const compress_level level=compress_level::default_level, const compress_strategy strategy=compress_strategy::default_strategy, const compress_format format=compress_format::zlib)
压缩字节向量
static byte_vector decompress(Iterator begin, Iterator end, const size_t estimated_original_size=0, const compress_format format=compress_format::zlib)
解压缩迭代器范围中的数据
static byte_vector compress(const string_view data, const compress_level level=compress_level::default_level, const compress_strategy strategy=compress_strategy::default_strategy, const compress_format format=compress_format::zlib)
压缩字符串视图
compress_format
压缩格式枚举
compress_strategy
压缩策略枚举
compress_level
压缩级别枚举
@ gzip
GZIP格式(RFC 1952)
@ zlib
ZLIB格式(RFC 1950)
@ deflate
原始Deflate流(无头尾)
@ default_strategy
默认策略,适用于通用数据
@ filtered
过滤策略,适用于由过滤器产生的数据
@ huffman_only
仅使用霍夫曼编码
@ default_level
默认压缩级别
@ best_compression
最佳压缩率,速度最慢
@ best_speed
最快速度,压缩率最低
vector< byte_t > byte_vector
字节向量类型别名
unsigned char byte_t
字节类型,定义为无符号字符
signed char int8_t
8位有符号整数类型
constexpr string format(const string_view fmt, Args &&... args)
格式化字符串
constexpr bool is_ranges_cot_iter_v
检查是否为范围连续迭代器
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
memory_view< byte_t > byte_view
字节视图类型别名
memory_view< const byte_t > cbyte_view
常量字节视图类型别名
constexpr none_t none
默认空表示
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
字符串类型别名和实用函数
const char * type() const noexcept override
获取异常类型
独占智能指针