streambf.h
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:2k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2. Stream Buffer
  3. Date:
  4. 2001/10/23
  5. Note:
  6. Queue客 厚搅茄 俺充栏肺 畴靛 窜困啊 酒囱 胶飘覆栏肺 贸府茄促.
  7. */
  8. #ifndef __ORZ_DATASTRUCTURE_STREAM_BUFFER__
  9. #define __ORZ_DATASTRUCTURE_STREAM_BUFFER__
  10. #include <stdio.h>
  11. template< class T >
  12. class CStreamBuffer
  13. {
  14. public:
  15. T * m_pBuf;
  16. int m_nBufLen;
  17. int m_nUseLen;
  18. public:
  19. CStreamBuffer();
  20. ~CStreamBuffer();
  21. void ClearAll();
  22. T *  Buffer() { return m_pBuf; }
  23. int  Length() { return m_nUseLen; }
  24. T  operator[]( int nPos ) { return m_pBuf[ nPos ]; }
  25. operator T * () { return m_pBuf; }
  26. operator const T * () const { return (const T *) m_pBuf; }
  27. bool Expand( int nBufLen );
  28. bool Append( T *pBuf, int nBufLen );
  29. void Remove( int nBufLen );
  30. };
  31. template< class T >
  32. CStreamBuffer< T >::CStreamBuffer()
  33. {
  34. m_pBuf = NULL;
  35. m_nBufLen = 0;
  36. m_nUseLen = 0;
  37. }
  38. template< class T >
  39. CStreamBuffer< T >::~CStreamBuffer()
  40. {
  41. ClearAll();
  42. }
  43. template< class T >
  44. void CStreamBuffer< T >::ClearAll()
  45. {
  46. if ( m_pBuf )
  47. {
  48. free( m_pBuf );
  49. m_pBuf = NULL;
  50. m_nBufLen = 0;
  51. m_nUseLen = 0;
  52. }
  53. }
  54. template< class T >
  55. bool CStreamBuffer< T >::Expand( int nBufLen )
  56. {
  57. m_pBuf = (T *) realloc( m_pBuf, sizeof( T ) * (m_nBufLen + nBufLen) );
  58. if ( !m_pBuf && (m_nBufLen + nBufLen) > 0 )
  59. return false;
  60. m_nBufLen += nBufLen;
  61. return true;
  62. }
  63. template< class T >
  64. bool CStreamBuffer< T >::Append( T *pBuf, int nBufLen )
  65. {
  66. if ( m_nBufLen < m_nUseLen + nBufLen )
  67. {
  68. if ( Expand( m_nUseLen + nBufLen - m_nBufLen ) == false )
  69. return false;
  70. }
  71. memcpy( m_pBuf + m_nUseLen, pBuf, nBufLen );
  72. m_nUseLen += nBufLen;
  73. return true;
  74. }
  75. template< class T >
  76. void CStreamBuffer< T >::Remove( int nBufLen )
  77. {
  78. memmove( m_pBuf, m_pBuf + nBufLen, sizeof( T ) * (m_nUseLen - nBufLen) );
  79. Expand( -nBufLen );
  80. m_nUseLen -= nBufLen;
  81. }
  82. #endif