2025-06-05 10:06:43 +08:00

180 lines
3.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ZSTREAM_HPP
#define ZSTREAM_HPP
#include "zlib_cpp.hpp"
#include <cstdint>
#include <vector>
#include <memory>
#include <functional>
namespace zlib_cpp {
// 前向声明
struct ZStreamImpl;
/**
* @brief ZStream类是zlib流处理的核心类对应于zlib的z_stream结构
*
* 这个类被设计为ZCompressor和ZDecompressor的基类
* 提供基本的数据流管理和状态控制功能。
*/
class ZStream {
public:
using AllocFunc = std::function<void*(void*, size_t, size_t)>;
using FreeFunc = std::function<void(void*, void*)>;
protected:
std::unique_ptr<ZStreamImpl> _impl;
bool _isInitialized = false;
// 自定义内存分配器和释放器(可选)
AllocFunc _allocFunc;
FreeFunc _freeFunc;
void* _allocOpaque = nullptr;
public:
/**
* @brief 构造函数
*/
ZStream();
/**
* @brief 带自定义内存分配函数的构造函数
*
* @param allocFunc 内存分配函数
* @param freeFunc 内存释放函数
* @param opaque 传递给分配/释放函数的透明指针
*/
ZStream(AllocFunc allocFunc, FreeFunc freeFunc, void* opaque);
/**
* @brief 析构函数
*/
virtual ~ZStream();
/**
* @brief 禁止拷贝构造
*/
ZStream(const ZStream&) = delete;
/**
* @brief 禁止赋值操作
*/
ZStream& operator=(const ZStream&) = delete;
/**
* @brief 移动构造函数
*/
ZStream(ZStream&& other) noexcept;
/**
* @brief 移动赋值操作符
*/
ZStream& operator=(ZStream&& other) noexcept;
/**
* @brief 设置输入数据
*
* @param data 输入数据的指针
* @param size 输入数据的大小
*/
void setInput(const uint8_t* data, size_t size);
/**
* @brief 设置输出缓冲区
*
* @param buffer 输出缓冲区指针
* @param size 输出缓冲区大小
*/
void setOutput(uint8_t* buffer, size_t size);
/**
* @brief 获取可用的输入数据大小
*
* @return 可用的输入数据大小
*/
size_t getAvailableInput() const;
/**
* @brief 获取可用的输出缓冲区大小
*
* @return 可用的输出缓冲区大小
*/
size_t getAvailableOutput() const;
/**
* @brief 获取总输入数据大小
*
* @return 总输入数据大小
*/
size_t getTotalInput() const;
/**
* @brief 获取总输出数据大小
*
* @return 总输出数据大小
*/
size_t getTotalOutput() const;
/**
* @brief 重置流状态
*
* @return 状态码
*/
virtual StatusCode reset() = 0;
/**
* @brief 获取最后的错误消息
*
* @return 错误消息
*/
std::string getLastErrorMessage() const;
/**
* @brief 获取数据类型
*
* @return 数据类型
*/
DataType getDataType() const;
/**
* @brief 设置数据类型
*
* @param type 数据类型
*/
void setDataType(DataType type);
/**
* @brief 获取Adler-32校验和
*
* @return Adler-32校验和
*/
uint32_t getAdler() const;
/**
* @brief 设置Adler-32校验和
*
* @param adler Adler-32校验和
*/
void setAdler(uint32_t adler);
protected:
/**
* @brief 初始化流
*
* @return 状态码
*/
virtual StatusCode init() = 0;
/**
* @brief 清理流资源
*
* @return 状态码
*/
virtual StatusCode end() = 0;
};
} // namespace zlib_cpp
#endif // ZSTREAM_HPP