#pragma once #include #include class CStream { public: CStream() {} virtual ~CStream() {} protected: public: virtual bool IsEnd() const = 0; virtual long Tell() = 0; virtual int Size() const = 0; virtual bool IsValid() const = 0; virtual void Close() {}; virtual void Activate() {} virtual int Seek( long lOffset, int nOrigin ) = 0; virtual int Read( void *pBuffer, int nSize ) = 0; virtual int Write( const void *pBuffer, int nSize ) = 0; virtual const char *GetName() { return NULL; } public: template void operator << ( TYPE Value ); void operator << ( const std::string &str ); void operator << ( const std::wstring &str ); template void operator << ( const std::vector &vecVALUE ); void operator << ( const std::vector &vecVALUE ); void operator << ( const std::vector &vecVALUE ); void WriteBuffer ( const void* pBuffer, int Size ); public: template void operator >> ( TYPE &Value ); void operator >> ( std::string &str ); void operator >> ( std::wstring &str ); template void operator >> ( std::vector &vecVALUE ); void operator >> ( std::vector &vecVALUE ); void operator >> ( std::vector &vecVALUE ); void ReadBuffer ( void* pBuffer, int Size ); public: template int SeekCur(); template int SeekCur_String(); template int SeekCur_Vec(); template int SeekCur_VecString(); }; template void CStream::operator << ( TYPE Value ) { Write ( &Value, sizeof(Value) ); } template void CStream::operator >> ( TYPE &Value ) { Read ( &Value, sizeof(Value) ); } template void CStream::operator << ( const std::vector &vecVALUE ) { DWORD dwVecSize = (DWORD)vecVALUE.size(); *this << ( dwVecSize ); if( !vecVALUE.empty() ) { WriteBuffer( &(vecVALUE[0]), DWORD(sizeof(TYPE)*vecVALUE.size()) ); } } template void CStream::operator >> ( std::vector &vecVALUE ) { DWORD dwSize(0); *this >> ( dwSize ); if( dwSize > 0 ) { vecVALUE.clear(); vecVALUE.reserve(dwSize); TYPE tVALUE; for ( DWORD i=0; i int CStream::SeekCur() { return Seek( sizeof(TYPE), SEEK_CUR ); } template int CStream::SeekCur_String() { DWORD dwSize; *this >> dwSize; if( dwSize > 0 ) { Seek( sizeof(TYPE)*dwSize, SEEK_CUR ); } return (int)dwSize; } template int CStream::SeekCur_Vec() { DWORD dwSize(0); *this >> ( dwSize ); if( dwSize > 0 ) { Seek( sizeof(TYPE)*dwSize, SEEK_CUR ); } return (int)dwSize; } template int CStream::SeekCur_VecString() { DWORD dwSize(0); *this >> ( dwSize ); if( dwSize > 0 ) { for ( DWORD i=0; i(); } } return (int)dwSize; } class CMemoryStream; class CFileStream : public CStream { public: CFileStream(); CFileStream( const char *pFileName, int nMode = OPEN_READ ); virtual ~CFileStream(); enum { OPEN_READ, OPEN_WRITE, OPEN_READ_WRITE }; protected: FILE *m_pStream; std::string m_szFileName; int m_nMode; public: virtual void Activate(); void SetFileName( const char *pFileName ) { m_szFileName = pFileName; } const char *GetFileName() { return m_szFileName.c_str(); } const char *GetName() { return GetFileName(); } bool Open( const char *pFileName, int nMode = OPEN_READ ); void Close(); bool IsEnd() const; long Tell() ; int Size() const; bool IsValid() const; int Seek( long lOffset, int nOrigin ); int Read( void *pBuffer, int nSize ); int Write( const void *pBuffer, int nSize ); }; class CMemoryStream : public CStream { public: CMemoryStream(); CMemoryStream( void *pBuffer, int nSize ); virtual ~CMemoryStream() {} void Initialize( void *pBuffer, int nSize ); protected: char *m_pBuffer; int m_nSize; int m_nCurrent; std::string m_szName; public: bool IsEnd() const; long Tell(); virtual int Size() const; bool IsValid() const; virtual int Seek( long lOffset, int nOrigin ); virtual int Read( void *pBuffer, int nSize ); virtual int Write( const void *pBuffer, int nSize ); char *GetBuffer() { return m_pBuffer; } const char *GetName() { return m_szName.c_str(); } void SetName( const char *szName ) { m_szName = szName; } }; class CPacketCompressStream : public CMemoryStream { public: CPacketCompressStream(); CPacketCompressStream( void *pBuffer, int nSize ); virtual ~CPacketCompressStream() {} enum CompressTypeEnum { NOCOMPRESS, INTEGER_SHORT, INTEGER_CHAR, DWORD_SHORT, DWORD_CHAR, FLOAT_SHORT, VECTOR2_SHORT, VECTOR3_SHORT, VECTOR2_BIT, VECTOR3_BIT, }; protected: int m_nValidBufferSize; int m_nValidBitCurrent; int m_nValueCount; public: virtual int Size() const; virtual int Read( void *pBuffer, int nSize ); virtual int Write( const void *pBuffer, int nSize ); int Seek( long lOffset, int nOrigin, CompressTypeEnum Type ); int Read( void *pBuffer, int nSize, CompressTypeEnum Type, float fValue = 0.f ); int Write( const void *pBuffer, int nSize, CompressTypeEnum Type, float fValue = 0.f ); }; class CByteStream : public CStream { public: typedef std::vector VEC_CHAR; typedef VEC_CHAR::iterator VEC_CHAR_IT; public: CByteStream(); CByteStream( void *pBuff, int nSize ); virtual ~CByteStream(){} protected: VEC_CHAR m_Buffer; int m_nCurrent; public: bool IsEnd() const; long Tell(); int Size() const; bool IsValid() const; int Seek( long lOffset, int nOrigin ); int Read( void *pBuffer, int nSize ); int Write( const void *pBuffer, int nSize ); char* GetBuffer() { return &m_Buffer[0]; } };