NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
lz4_compress.hpp
浏览该文件的文档.
1#ifndef NEFORCE_COMPRESS_LZ4_COMPRESS_HPP__
2#define NEFORCE_COMPRESS_LZ4_COMPRESS_HPP__
3
12
13#if defined(NEFORCE_SUPPORT_LZ4) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
14# include <lz4.h>
17NEFORCE_BEGIN_NAMESPACE__
18
24
31struct lz4_exception final : thirdparty_exception {
32 explicit lz4_exception(const char* info = "LZ4 Operation Failed.", const char* type = static_type,
33 const int code = 0) noexcept :
34 thirdparty_exception(info, type, code) {}
35
36 explicit lz4_exception(const exception& e) :
37 thirdparty_exception(e) {}
38
39 ~lz4_exception() override = default;
40 static constexpr auto static_type = "lz4_exception";
41};
42 // Exceptions
44
50
58class NEFORCE_API lz4_compressor {
59public:
65 static constexpr size_t block_size = 65536;
66
67private:
76 NEFORCE_NODISCARD static byte_vector compress_data(const byte_t* data, size_t size, int level);
77
88 NEFORCE_NODISCARD static byte_vector decompress_data(const byte_t* data, size_t size,
89 size_t estimated_original_size);
90
91public:
106 template <typename Iterator>
107 NEFORCE_NODISCARD static byte_vector compress(Iterator begin, Iterator end, const int level = 0) {
108 static_assert(is_ranges_cot_iter_v<Iterator>, "Iterator must be contiguous_iterator");
109 static_assert(sizeof(iter_value_t<Iterator>) == 1, "Iterator must point to byte-sized elements");
110
111 const auto* data = reinterpret_cast<const byte_t*>(&*begin);
112 const size_t data_size = _NEFORCE distance(begin, end);
113 return compress_data(data, data_size, level);
114 }
115
127 NEFORCE_NODISCARD static byte_vector compress(const string_view data, const int level = 0) {
128 return compress_data(reinterpret_cast<const byte_t*>(data.data()), data.size(), level);
129 }
130
144 template <typename T>
145 NEFORCE_NODISCARD static byte_vector compress(const vector<T>& data, const int level = 0) {
146 static_assert(sizeof(T) == 1, "Iterator must point to byte-sized elements");
147
148 return lz4_compressor::compress_data(reinterpret_cast<const byte_t*>(data.data()), data.size() * sizeof(T),
149 level);
150 }
151
163 template <typename Iterator, enable_if_t<is_ranges_cot_iter_v<Iterator>, int> = 0>
164 NEFORCE_NODISCARD static byte_vector decompress(Iterator begin, Iterator end,
165 const size_t estimated_original_size = 0) {
166 static_assert(sizeof(iter_value_t<Iterator>) == 1, "Iterator must point to byte-sized elements");
167
168 const auto* data = reinterpret_cast<const byte_t*>(&*begin);
169 const size_t data_size = _NEFORCE distance(begin, end);
170
171 return decompress_data(data, data_size, estimated_original_size);
172 }
173
181 NEFORCE_NODISCARD static byte_vector decompress(const cbyte_view& data, const size_t estimated_original_size = 0) {
182 return decompress_data(data.data(), data.size(), estimated_original_size);
183 }
184
193 class NEFORCE_API stream_compressor {
194 private:
195 ::LZ4_stream_t* stream_ = nullptr;
196 bool use_hc_ = false;
197 int level_ = 0;
198 size_t bytes_input_ = 0;
199 size_t bytes_output_ = 0;
200 bool finished_ = false;
201
202 public:
212 explicit stream_compressor(int level = 0);
213
218
219 stream_compressor(const stream_compressor&) = delete;
220 stream_compressor& operator=(const stream_compressor&) = delete;
221
227
234
245
254
261
271 void reset(int level = 0);
272
277 NEFORCE_NODISCARD size_t bytes_input() const noexcept { return bytes_input_; }
278
283 NEFORCE_NODISCARD size_t bytes_output() const noexcept { return bytes_output_; }
284
289 NEFORCE_NODISCARD double compression_ratio() const noexcept {
290 return bytes_input_ > 0 ? static_cast<double>(bytes_output_) / bytes_input_ : 0.0;
291 }
292 };
293
301 class NEFORCE_API stream_decompressor {
302 private:
303 ::LZ4_streamDecode_t* stream_ = nullptr;
304 size_t bytes_input_ = 0;
305 size_t bytes_output_ = 0;
306 bool finished_ = false;
307
308 public:
314
319
321 stream_decompressor& operator=(const stream_decompressor&) = delete;
322
328
335
344
351
356 void reset();
357
362 NEFORCE_NODISCARD size_t bytes_input() const noexcept { return bytes_input_; }
363
368 NEFORCE_NODISCARD size_t bytes_output() const noexcept { return bytes_output_; }
369
374 NEFORCE_NODISCARD double expansion_ratio() const noexcept {
375 return bytes_input_ > 0 ? static_cast<double>(bytes_output_) / bytes_input_ : 0.0;
376 }
377 };
378};
379 // Compression
381
382NEFORCE_END_NAMESPACE__
383#endif
384#endif // NEFORCE_COMPRESS_LZ4_COMPRESS_HPP__
stream_compressor(stream_compressor &&other) noexcept
移动构造函数
void reset(int level=0)
重置压缩器状态
size_t bytes_output() const noexcept
获取输出字节数
size_t bytes_input() const noexcept
获取输入字节数
byte_vector compress(const cbyte_view &data, bool finish=false)
压缩数据
double compression_ratio() const noexcept
获取压缩率
stream_compressor(int level=0)
构造函数
byte_vector compress(string_view data, bool finish=false)
压缩字符串视图
stream_compressor & operator=(stream_compressor &&other) noexcept
移动赋值运算符
byte_vector finish()
完成压缩并返回剩余数据
stream_decompressor(stream_decompressor &&other) noexcept
移动构造函数
double expansion_ratio() const noexcept
获取扩展率
void reset()
重置解压缩器状态
byte_vector finish()
完成解压缩并返回剩余数据
size_t bytes_input() const noexcept
获取输入字节数
size_t bytes_output() const noexcept
获取输出字节数
stream_decompressor & operator=(stream_decompressor &&other) noexcept
移动赋值运算符
byte_vector decompress(const byte_view &data, bool finish=false)
解压缩数据
LZ4压缩解压缩工具类
static constexpr size_t block_size
最大块大小常量
static byte_vector decompress(const cbyte_view &data, const size_t estimated_original_size=0)
解压缩常量字节视图
static byte_vector compress(const vector< T > &data, const int level=0)
压缩字节向量
static byte_vector compress(Iterator begin, Iterator end, const int level=0)
压缩迭代器范围中的数据
static byte_vector decompress(Iterator begin, Iterator end, const size_t estimated_original_size=0)
解压缩迭代器范围中的数据
static byte_vector compress(const string_view data, const int level=0)
压缩字符串视图
动态大小数组容器
vector< byte_t > byte_vector
字节向量类型别名
unsigned char byte_t
字节类型,定义为无符号字符
NEFORCE_INLINE17 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
常量字节视图类型别名
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
字符串类型别名和实用函数
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
NEFORCE_NODISCARD int code() const noexcept
获取异常码
NEFORCE_NODISCARD const char * type() const noexcept
获取异常类型
动态大小数组容器