将内存模拟成C++流的方法
将内存模拟成C++流的方法
	如何将一个 内存 模拟成一个C++流,
	把一个内存new出来后,在这段内存上面建立一个 C++ 的istream类.以后所有的操作都可以对这个istream类进行.
	这样做有很多好处,比如,你的资源分析器可以接受一个istream指针,这个istream可能是一个fstream.也可能是你从zip文件中解出到内存后,从内存构造的一个istream.
	
	具体做法是,从basic_streambuf里派生一个类,
	这里只介绍一个简单的支持输出的streambuf.如果谁完善了它,或者实现了一个支持各种特性,输入输出,block buffer等功能的时候,麻烦也告诉我一下.不胜感激.
	 
	#ifndef __MEM_STREAM_BUFFER_H__
	#define __MEM_STREAM_BUFFER_H__
	/*
	提供 C++ 标准库的扩展。支持从一段内存上建立一个istream类。
	
	作者: 潘李亮 2004 - 10 - 25 
	Xheartblue 2004-10-25
	
	本代码为免费代码,可以只有使用和修改。
	但是你得保留本声明和作者名字。
	
	*/
	#include <streambuf>
	
	namespace std
	{
	
	template <typename _CharT, typename _CharTrait = char_traits<_CharT> > 
	class mem_streambuf : public basic_streambuf<_CharT,_CharTrait>
	{
	public: //类型的定义 
	typedef _CharT streambuf_type;
	typedef _CharT char_type;
	typedef int int_type;
	typedef typename std::streampos pos_type;
	typedef typename std::streamsize off_type;
	
	protected:
	size_t m_bufLen;
	char_type* m_buffer;
	bool m_bIsAllocInner;
	public:
	
	//构造函数
	mem_streambuf(char_type* buf,size_t len)
	{
	set_buf(buf,len);
	}
	mem_streambuf()
	{
	m_buffer = NULL;
	m_bufLen = 0;
	m_bIsAllocInner = false; 
	}
	mem_streambuf(size_t len)
	{
	m_buffer = NULL;
	m_bufLen = 0;
	m_bIsAllocInner = false;
	alloc_buf(len);
	_init();
	}
	~mem_streambuf()
	{
	dealloc_buf();
	}
	
	bool alloc_buf(int len)
	{
	dealloc_buf();
	m_buffer = new char_type[len];
	m_bIsAllocInner = true;
	m_bufLen = len;
	return true;
	}
	bool set_buf(char_type* buf,size_t len)
	{
	m_buffer = buf;
	m_bufLen = len;
	m_bIsAllocInner = false;
	_init();
	return true;
	}
	bool dealloc_buf()
	{
	if(m_bIsAllocInner)
	{
	delete [] m_buffer;
	}
	m_buffer = NULL;
	m_bufLen = 0;
	m_bIsAllocInner = false;
	return true;
	}
	
	char_type* get_buf()
	{
	return m_buffer;
	}
	
	protected:
	void _init()
	{
	setg(m_buffer,m_buffer,m_buffer+ m_bufLen);
	setp(m_buffer,m_buffer,m_buffer+ m_bufLen);
	}
	
	};//endl class mem_streambuf;
	
	template <typename _CharT , typename _CharTrait = char_traits<_CharT> >
	class basic_imemstream : public basic_istream<_CharT,_CharTrait>
	{
	public:
	typedef mem_streambuf<_CharT,_CharTrait> stream_type;
	typedef _CharT char_type;
	protected:
	stream_type m_buffer;
	
	public:
	basic_imemstream(stream_type* buf): basic_istream<_CharT,_CharTrait>(buf)
	{
	}
	
	basic_imemstream(char_type* buf,size_t len)
	:m_buffer(buf,len),basic_istream<_CharT,_CharTrait>(&m_buffer)
	{
	}
	
	basic_imemstream():m_buffer(),basic_istream<_CharT,_CharTrait>(&m_buffer)
	{
	
	}
	
	basic_imemstream(int len)
	:m_buffer(len),basic_istream<_CharT,_CharTrait>(&m_buffer)
	{
	}
	
	void set_buf(char_type* buf,int len)
	{
	m_buffer.set_buf(buf,len);
	}
	
	char_type* get_buf()
	{
	return m_buffer.get_buf();
	}
	
	basic_streambuf<_CharT,_CharTrait>* rdbuf()
	{
	return &m_buffer;
	}
	
	void rdbuf(basic_streambuf<_CharT,_CharTrait>* buf)