1#ifndef NEFORCE_COMPRESS_ZLIB_COMPRESS_HPP__
2#define NEFORCE_COMPRESS_ZLIB_COMPRESS_HPP__
13#ifdef NEFORCE_SUPPORT_ZLIB
17NEFORCE_BEGIN_NAMESPACE__
31struct zlib_exception final : thirdparty_exception {
32 explicit zlib_exception(
const char* info =
"Zlib Operation Failed.",
int code = 0) noexcept :
33 thirdparty_exception(info),
36 explicit zlib_exception(
const exception& e) :
37 thirdparty_exception(e) {}
39 ~zlib_exception()
override =
default;
41 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "zlib_exception"; }
104 struct compressor_stream_deleter {
105 void operator()(::z_stream* s)
const noexcept {
107 if (s->state !=
nullptr) {
115 struct decompressor_stream_deleter {
116 void operator()(::z_stream* s)
const noexcept {
118 if (s->state !=
nullptr) {
167 template <
typename Iterator>
177 return compress_data(
data, data_size, level, strategy,
format);
194 return compress_data(
reinterpret_cast<const byte_t*
>(
data.data()),
data.size(), level, strategy,
format);
209 template <
typename T>
214 static_assert(
sizeof(T) == 1,
"Vector must contain byte-sized elements");
216 return zlib_compressor::compress_data(
reinterpret_cast<const byte_t*
>(
data.data()),
data.size() *
sizeof(T),
230 template <
typename Iterator>
232 const size_t estimated_original_size = 0,
241 return decompress_data(
data, data_size, estimated_original_size,
format);
254 return decompress_data(
data.data(),
data.size(), estimated_original_size,
format);
268 bool initialized_ =
false;
269 size_t bytes_input_ = 0;
270 size_t bytes_output_ = 0;
353 NEFORCE_NODISCARD
size_t bytes_input() const noexcept {
return bytes_input_; }
359 NEFORCE_NODISCARD
size_t bytes_output() const noexcept {
return bytes_output_; }
366 return bytes_input_ > 0 ?
static_cast<double>(bytes_output_) /
static_cast<double>(bytes_input_) : 0.0;
381 bool initialized_ =
false;
382 size_t bytes_input_ = 0;
383 size_t bytes_output_ = 0;
449 NEFORCE_NODISCARD
size_t bytes_input() const noexcept {
return bytes_input_; }
455 NEFORCE_NODISCARD
size_t bytes_output() const noexcept {
return bytes_output_; }
462 return bytes_input_ > 0 ?
static_cast<double>(bytes_output_) /
static_cast<double>(bytes_input_) : 0.0;
469NEFORCE_END_NAMESPACE__
~stream_compressor()=default
析构函数
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
获取输入字节数
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()=default
析构函数
stream_decompressor & operator=(stream_decompressor &&other) noexcept
移动赋值运算符
double expansion_ratio() const noexcept
获取扩展率
void reset(compress_format format=compress_format::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)
压缩字符串视图
@ default_strategy
默认策略,适用于通用数据
@ filtered
过滤策略,适用于由过滤器产生的数据
@ best_compression
最佳压缩率,速度最慢
vector< byte_t > byte_vector
字节向量类型别名
unsigned char byte_t
字节类型,定义为无符号字符
signed char int8_t
8位有符号整数类型
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
获取异常类型