您的位置:首页 > 编程语言 > C语言/C++

【RLIB】内存流(Stream) 的简易C++实现

2012-02-02 15:46 351 查看
相关源码参见RLIB开源项目

下面是RLIB1.x的头文件:

namespace System
{
	namespace IO
	{
		/// <summary>
		/// 提供字节序列的一般视图, 是所有流的基类
		/// </summary>
		class export Stream
		{
		protected:
			// 流位置
			ULONG  m_pos;  
			// 流大小
			ULONG  m_size; 
			// 流已写长度
			ULONG  m_length; 
			// 流指针
			LPVOID m_ptr;  
		public:
			/// <summary>
			/// 初始化
			/// </summary>
			Stream():m_pos(0),m_size(0),m_length(0),m_ptr(NULL){/*Initialize*/};
			/// <summary>
			/// 用内存指针、内存大小、实际长度初始化
			/// </summary>
			Stream(LPVOID lpbuffer, ULONG size, ULONG len):m_pos(0){ this->m_ptr  = lpbuffer; this->m_size = size; this->m_length = len; };
			/// <summary>
			/// 获取当前流中的位置
			/// </summary>
			inline ULONG GetPos() const{ return this->m_pos; };
			/// <summary>
			/// 设置当前流中的位置
			/// </summary>
			void SetPos(ULONG Pos);
			// 获取或设置当前流中的位置
			__declspec(property(get = GetPos, put = SetPos)) ULONG Position;
			/// <summary>
			/// 获取流数据指针
			/// </summary>
			inline LPVOID GetObjectData() const{ return this->m_ptr; }
			/// <summary>
			/// 设置流数据指针
			/// </summary>
			inline void SetObjectData(LPVOID pData){ this->m_ptr = pData; };
			// 获取或设置流数据指针
			__declspec(property(get = GetObjectData, put = SetObjectData)) LPVOID ObjectData;
			/// <summary>
			/// 获取用字节表示的流大小
			/// </summary>
			inline ULONG GetSize() const{ return this->m_size; };
			/// <summary>
			/// 设置用字节表示的流大小
			/// </summary>
			inline void SetSize(ULONG size){ this->m_size = size; };
			// 获取或设置用字节表示的流大小
			__declspec(property(get = GetSize, put = SetSize)) ULONG Size;
			/// <summary>
			/// 获取用字节表示的流长度
			/// </summary>
			inline ULONG GetLength() const{ return this->m_length; };
			/// <summary>
			/// 设置用字节表示的流长度
			/// </summary>
			inline void SetLength(ULONG len){ this->m_length = len; };
			// 获取用字节表示的流长度
			__declspec(property(get = GetLength, put = SetLength)) ULONG Length;
			/// <summary>
			/// 从当前流中读取字节块并将数据写入 buffer 中
			/// </summary>
			/// <returns>
			/// 写入缓冲区中的总字节数. 如果当前可用字节数不到所请求的字节数,
			/// 则这一总字节数可能小于所请求的字节数,或者如果在读取任何字节前已到达流的末尾则为零
			/// 产生任何异常均返回-1
			/// </returns>
			int Read(LPVOID buffer, int count) const;
			/// <summary>
			/// 使用从缓冲区读取的数据将字节块写入当前流
			/// </summary>
			/// <returns>如果写操作成功,则流中的位置将提升写入的字节数</returns>
			void Write(LPVOID buffer, int count);
			/// <summary>
			/// 关闭当前流并释放与之关联的所有资源
			/// </summary>
			void Close(){/*子类必须重写此方法*/};
		};
		/// <summary>
		/// 创建其支持存储区为内存的流
		/// 但该流具有固定大小
		/// </summary>
		class export MemoryStream:public Stream
		{
		public:
			/// <summary>
			/// 初始化指定大小的内存流
			/// </summary>
			MemoryStream(ULONG);
			/// <summary>
			/// 负责内存流的回收
			/// </summary>
			~MemoryStream();
			RLIB_ClassNewDel;
		public:
			/// <summary>
			/// 方法不被支持
			/// </summary>
			inline void SetObjectData(LPVOID/* pData*/){};
			// 获取流数据指针
			__declspec(property(get = GetObjectData)) LPVOID ObjectData;
			/// <summary>
			/// 方法不被支持
			/// </summary>
			inline void SetSize(ULONG/* size*/){};
			// 获取用字节表示的流大小
			__declspec(property(get = GetSize)) ULONG Size;
			/// <summary>
			/// 方法不被支持
			/// </summary>
			inline void SetLength(ULONG/* len*/){};
			// 获取用字节表示的流长度
			__declspec(property(get = GetLength)) ULONG Length;
			/// <summary>
			/// 重写基类方法
			/// 关闭当前流并释放与之关联的所有资源
			/// </summary>
			void Close();
		public:
			/// <summary>
			/// 获取内存流使用的内存池指针
			/// </summary>
			/// <returns>该方法可能返回NULL</returns>
			static Memory *GetUsingPool();
			/// <summary>
			/// 释放由 MemoryStream 占用的所有资源
			/// </summary>
			static void Dispose();
		};
		/// <summary>
		/// 创建其支持存储区为内存的流
		/// 但该流支持动态内存分配
		/// </summary>
		class export BufferedStream:public MemoryStream
		{
		public:
			/// <summary>
			/// 使类可实例化
			/// </summary>
			BufferedStream(ULONG size = sizeof(int)):MemoryStream(size){};
			RLIB_ClassNewDel;
		public:
			/// <summary>
			/// 重载基类方法以支持动态内存分配
			/// </summary>
			void Write(LPVOID buffer, int count);
		};
	};
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: