?? streambuf.h
字號(hào):
// StreamBuf.h: interface for the CStreamBuf class.
// luoxin 04-05-19
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_STREAMBUF_H__331CDA77_E7B6_41CE_A080_3B2C4B088DE8__INCLUDED_)
#define AFX_STREAMBUF_H__331CDA77_E7B6_41CE_A080_3B2C4B088DE8__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Exlibrarydef.h"
#include "afxtempl.h"
/************************************************************************/
// CStreamBufException
/************************************************************************/
class ExLIBRARYEXT CStreamBufException : public CException
{
DECLARE_DYNAMIC(CStreamBufException)
public:
enum { none, endOfBuf, errFormat};
CStreamBufException(int cause = CStreamBufException::none):m_cause(cause){}
int m_cause;
};
inline void ThrowStreamBufException(int cause)
{THROW(new CStreamBufException(cause));}
#define ThrowSBException_ErrFormat() ThrowStreamBufException(CStreamBufException::errFormat)
#define ThrowSBException_EndOfBuf() ThrowStreamBufException(CStreamBufException::endOfBuf)
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/************************************************************************/
// CStreamBuf
/************************************************************************/
class ExLIBRARYEXT CStreamBuf
{
public:
enum SBIO{SBIOIn, SBIOOut}; //向CStreamBuf寫(xiě)入,從CStreamBuf讀取
//當(dāng)pBuf為NULL時(shí),就是用來(lái)計(jì)算需要的BUFFER長(zhǎng)度,最后可以用GetDataSize()得到需要的長(zhǎng)度
CStreamBuf(PVOID pBuf, DWORD dwBufSize, SBIO io);
virtual ~CStreamBuf(){}
SBIO GetIOState()const;
BOOL IsLoading()const;
BOOL IsStoring()const;
UINT Read(void* lpBuf, UINT nMax);
UINT Write(const void* lpBuf, UINT nMax);
void SkipReadTo(const void* lpFind, UINT nSize); //從當(dāng)前位置開(kāi)始找到第一個(gè)與lpFind指向的內(nèi)容一致的地方的結(jié)尾,將當(dāng)前讀取指針移動(dòng)到這個(gè)地方后面一個(gè)位置
DWORD GetLeftBufSize()const;
DWORD GetDataSize()const;
UINT WriteLineANSI(LPCTSTR lpszString); //轉(zhuǎn)換成為ANSI字符集寫(xiě)入
UINT ReadLineANSI(LPTSTR lpszString, UINT nMax); //以ANSI字符集方式讀入,并轉(zhuǎn)換成為相應(yīng)字符集
public:
// insertion operations
CStreamBuf& operator<<(BYTE by);
CStreamBuf& operator<<(WORD w);
CStreamBuf& operator<<(LONG l);
CStreamBuf& operator<<(DWORD dw);
CStreamBuf& operator<<(float f);
CStreamBuf& operator<<(double d);
CStreamBuf& operator<<(ULONGLONG qw);
CStreamBuf& operator<<(LONGLONG qws);
CStreamBuf& operator<<(REFGUID guid);
CStreamBuf& operator<<(const CString& string);
CStreamBuf& operator<<(int i);
CStreamBuf& operator<<(short w);
CStreamBuf& operator<<(char ch);
CStreamBuf& operator<<(unsigned u);
CStreamBuf& operator<<(bool b);
CStreamBuf& operator<<(const RECT& rc);
#ifdef _NATIVE_WCHAR_T_DEFINED
CStreamBuf& operator<<(wchar_t ch);
#endif
// extraction operations
CStreamBuf& operator>>(BYTE& by);
CStreamBuf& operator>>(WORD& w);
CStreamBuf& operator>>(DWORD& dw);
CStreamBuf& operator>>(LONG& l);
CStreamBuf& operator>>(float& f);
CStreamBuf& operator>>(double& d);
CStreamBuf& operator>>(ULONGLONG& qw);
CStreamBuf& operator>>(LONGLONG& qws);
CStreamBuf& operator>>(GUID& guid);
CStreamBuf& operator>>(CString& string);
CStreamBuf& operator>>(int& i);
CStreamBuf& operator>>(short& w);
CStreamBuf& operator>>(char& ch);
CStreamBuf& operator>>(unsigned& u);
CStreamBuf& operator>>(bool& b);
CStreamBuf& operator>>(RECT& rc);
#ifdef _NATIVE_WCHAR_T_DEFINED
CStreamBuf& operator>>(wchar_t& ch);
#endif
protected:
PBYTE const m_pBufEnd;
PBYTE m_pBufCur;
SBIO m_IO;
DWORD m_dwDataSize;
};
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#define CheckStreamBufSize(DataTYPE) if(m_pBufCur&&GetLeftBufSize()<sizeof(DataTYPE))ThrowSBException_EndOfBuf();
inline CStreamBuf::CStreamBuf(PVOID pBuf, DWORD dwBufSize, SBIO io):
m_pBufCur((PBYTE)pBuf),m_pBufEnd((PBYTE)pBuf+dwBufSize),m_IO(io),m_dwDataSize(NULL)
{
}
inline CStreamBuf::SBIO CStreamBuf::GetIOState()const
{return m_IO;}
inline BOOL CStreamBuf::IsLoading() const
{return m_IO==SBIOOut;}
inline BOOL CStreamBuf::IsStoring() const
{return m_IO==SBIOIn;}
inline DWORD CStreamBuf::GetLeftBufSize()const
{ASSERT(m_pBufCur);ASSERT(m_pBufEnd>=m_pBufCur);
return (m_pBufEnd-m_pBufCur);}
inline DWORD CStreamBuf::GetDataSize()const
{return m_dwDataSize;}
//////////////////////////////////////////////////////////////////////////
inline CStreamBuf& CStreamBuf::operator<<(int i)
{ return CStreamBuf::operator<<((LONG)i); }
inline CStreamBuf& CStreamBuf::operator<<(unsigned u)
{ return CStreamBuf::operator<<((LONG)u); }
inline CStreamBuf& CStreamBuf::operator<<(short w)
{ return CStreamBuf::operator<<((WORD)w); }
inline CStreamBuf& CStreamBuf::operator<<(char ch)
{ return CStreamBuf::operator<<((BYTE)ch); }
inline CStreamBuf& CStreamBuf::operator<<(bool b)
{ return CStreamBuf::operator <<((BYTE)(b ? 1 : 0)); }
inline CStreamBuf& CStreamBuf::operator<<(LONGLONG qws)
{ return CStreamBuf::operator<<((ULONGLONG)qws); }
inline CStreamBuf& CStreamBuf::operator<<(const RECT& rc)
{*this<<rc.left<<rc.right<<rc.top<<rc.bottom;return *this;}
#ifdef _NATIVE_WCHAR_T_DEFINED
inline CStreamBuf& CStreamBuf::operator<<(wchar_t ch)
{ return CStreamBuf::operator<<((WORD)ch); }
#endif
#define SBWriteToBuf(DataType, DataName)\
{ ASSERT(IsStoring());\
if(m_pBufCur){\
*(UNALIGNED DataType*)m_pBufCur = DataName;\
m_pBufCur += sizeof(DataType);\
}\
m_dwDataSize += sizeof(DataType);\
return *this; \
}
#define SBCheckAndWriteToBuf(DataType, DataName) {CheckStreamBufSize(DataType);SBWriteToBuf(DataType, DataName)}
inline CStreamBuf& CStreamBuf::operator<<(BYTE by)
{ SBCheckAndWriteToBuf(BYTE, by);}
inline CStreamBuf& CStreamBuf::operator<<(ULONGLONG qw)
{ SBCheckAndWriteToBuf(ULONGLONG, qw);}
inline CStreamBuf& CStreamBuf::operator<<(WORD w)
{ SBCheckAndWriteToBuf(WORD, w);}
inline CStreamBuf& CStreamBuf::operator<<(LONG l)
{ SBCheckAndWriteToBuf(LONG, l);}
inline CStreamBuf& CStreamBuf::operator<<(DWORD dw)
{ SBCheckAndWriteToBuf(DWORD, dw);}
inline CStreamBuf& CStreamBuf::operator<<(float f)
{ CheckStreamBufSize(float);
if(m_pBufCur){*(UNALIGNED _EXL_BYTE_FLOAT*)m_pBufCur = *(_EXL_BYTE_FLOAT*)&f; m_pBufCur += sizeof(float);}
m_dwDataSize += sizeof(float); return *this;}
inline CStreamBuf& CStreamBuf::operator<<(double d)
{ CheckStreamBufSize(double);
if(m_pBufCur){*(UNALIGNED _EXL_BYTE_DOUBLE*)m_pBufCur = *(_EXL_BYTE_DOUBLE*)&d; m_pBufCur += sizeof(double); }
m_dwDataSize += sizeof(double);return *this; }
inline CStreamBuf& CStreamBuf::operator<<(REFGUID guid)
{SBCheckAndWriteToBuf(GUID, guid);}
//////////////////////////////////////////////////////////////////////////
inline CStreamBuf& CStreamBuf::operator>>(int& i)
{ return CStreamBuf::operator>>((LONG&)i); }
inline CStreamBuf& CStreamBuf::operator>>(unsigned& u)
{ return CStreamBuf::operator>>((LONG&)u); }
inline CStreamBuf& CStreamBuf::operator>>(short& w)
{ return CStreamBuf::operator>>((WORD&)w); }
inline CStreamBuf& CStreamBuf::operator>>(char& ch)
{ return CStreamBuf::operator>>((BYTE&)ch); }
inline CStreamBuf& CStreamBuf::operator>>(LONGLONG& qws)
{ return CStreamBuf::operator>>((ULONGLONG&)qws); }
inline CStreamBuf& CStreamBuf::operator>>(bool& b)
{ BYTE by; CStreamBuf& ar = CStreamBuf::operator>>(by); b = (by ? true : false); return ar; }
inline CStreamBuf& CStreamBuf::operator>>(RECT& rc)
{*this>>rc.left>>rc.right>>rc.top>>rc.bottom;return *this;}
#ifdef _NATIVE_WCHAR_T_DEFINED
inline CStreamBuf& CStreamBuf::operator>>(wchar_t& ch)
{ return CStreamBuf::operator>>((WORD&)ch); }
#endif
#define SBReadFromBuf(DataType, DataName)\
{ ASSERT(IsLoading());\
if(m_pBufCur){\
DataName = *(UNALIGNED DataType*)m_pBufCur; m_pBufCur += sizeof(DataType);}\
m_dwDataSize += sizeof(DataType);\
return *this;\
}
#define SBCheckAndReadFromBuf(DataType, DataName) {CheckStreamBufSize(DataType);SBReadFromBuf(DataType, DataName)}
inline CStreamBuf& CStreamBuf::operator>>(BYTE& by)
{ SBCheckAndReadFromBuf(BYTE, by);}
inline CStreamBuf& CStreamBuf::operator>>(ULONGLONG& qw)
{ SBCheckAndReadFromBuf(ULONGLONG, qw);}
inline CStreamBuf& CStreamBuf::operator>>(WORD& w)
{ SBCheckAndReadFromBuf(WORD, w);}
inline CStreamBuf& CStreamBuf::operator>>(LONG& l)
{ SBCheckAndReadFromBuf(LONG, l);}
inline CStreamBuf& CStreamBuf::operator>>(DWORD& dw)
{ SBCheckAndReadFromBuf(DWORD, dw);}
inline CStreamBuf& CStreamBuf::operator>>(float& f)
{ CheckStreamBufSize(float);
if(m_pBufCur){*(_EXL_BYTE_FLOAT*)&f = *(UNALIGNED _EXL_BYTE_FLOAT*)m_pBufCur; m_pBufCur += sizeof(float);}
m_dwDataSize += sizeof(float);return *this; }
inline CStreamBuf& CStreamBuf::operator>>(double& d)
{ CheckStreamBufSize(double);
if(m_pBufCur){*(_EXL_BYTE_DOUBLE*)&d = *(UNALIGNED _EXL_BYTE_DOUBLE*)m_pBufCur; m_pBufCur += sizeof(double);}
m_dwDataSize += sizeof(double);return *this; }
inline CStreamBuf& CStreamBuf::operator>>(GUID& guid)
{SBCheckAndReadFromBuf(GUID, guid);}
//////////////////////////////////////////////////////////////////////////
// helper
//////////////////////////////////////////////////////////////////////////
#define SBReadToArray(ar, array)\
{\
int nCount; ar>>nCount; array.SetSize(nCount);\
for(int i=0; i<nCount; i++)ar>>(array[i]);\
}
#define SBWriteFromArray(ar, array)\
{\
ar<<array.GetSize();for(int i=0; i<array.GetSize(); i++)ar<<(array[i]);\
}
#endif // !defined(AFX_STREAMBUF_H__331CDA77_E7B6_41CE_A080_3B2C4B088DE8__INCLUDED_)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -