00001 // Buffer.h 00002 ////////////////////////////////////////////////////////////////////// 00003 // (c) Copyright 2002 Brown Deer Technology, LLC. 00004 // All rights reserved. 00005 ////////////////////////////////////////////////////////////////////// 00006 00007 #ifndef BUFFER_H 00008 #define BUFFER_H 00009 00010 #ifdef USE_STD 00011 #include <iostream> 00012 #include <string> 00013 using namespace std; 00014 #else 00015 #include <iostream.h> 00016 #include <string.h> 00017 #endif 00018 00019 #include "BufferBase.h" 00020 00021 #define BUFFER_DEFAULT_SIZEMAX 256 00022 00023 class Buffer : public BufferBase 00024 { 00025 public: 00026 00027 string isa() const { return "Buffer"; } 00028 00029 Buffer( int sizemax = BUFFER_DEFAULT_SIZEMAX ); 00030 00031 Buffer( const Buffer& rhs ); 00032 00033 Buffer( BufferBase& buf ); 00034 00035 ~Buffer(); 00036 00037 Buffer& operator = ( Buffer& rhs ); 00038 00039 void put( char c ); 00040 void get( char& c ); 00041 char get(); 00042 00043 void put( int i, char c ); 00044 void get( int i, char& c ); 00045 char get( int i ); 00046 00047 void resizemax( int sizemax = BUFFER_DEFAULT_SIZEMAX ); 00048 00049 void erase(); 00050 00051 const char* c_str(); 00052 00053 protected: 00054 int _sizemax; 00055 char* _data; 00056 00057 }; 00058 00059 inline 00060 Buffer::Buffer( int sizemax ) 00061 : _sizemax(sizemax) 00062 { 00063 _data = new char[sizemax]; 00064 } 00065 00066 inline 00067 Buffer::Buffer( const Buffer& rhs ) 00068 : BufferBase(rhs), 00069 _sizemax(rhs._sizemax) 00070 { 00071 _data = new char[rhs._sizemax]; 00072 for( int i = 0; i < rhs._size; ++i ) _data[i] = rhs._data[i]; 00073 } 00074 00075 inline 00076 Buffer::Buffer( BufferBase& buf ) 00077 : BufferBase(buf), 00078 _sizemax(BUFFER_DEFAULT_SIZEMAX) 00079 { 00080 _data = new char[BUFFER_DEFAULT_SIZEMAX]; 00081 buf.seekg(0); 00082 for( int i = 0; i < buf.size(); ++i ) buf.get( _data[i] ); 00083 } 00084 00085 inline 00086 Buffer::~Buffer() 00087 { 00088 if ( _data != 0 ) { delete [] _data; _data = 0; } 00089 } 00090 00091 inline 00092 Buffer& Buffer::operator = ( Buffer& rhs ) 00093 { 00094 if ( this != &rhs ) { 00095 BufferBase::operator=(rhs); 00096 resizemax( rhs._sizemax ); 00097 for( int i = 0; i < rhs._size; ++i ) _data[i] = rhs._data[i]; 00098 } 00099 return *this; 00100 } 00101 00102 inline 00103 void Buffer::put( char c ) 00104 { 00105 if ( _size == _sizemax ) resizemax( _sizemax * 2 ); 00106 _data[_putpos] = c; 00107 BufferBase::put(c); 00108 } 00109 00110 inline 00111 void Buffer::get( char& c ) 00112 { 00113 if ( !eob() ) { 00114 c = _data[ _getpos ]; 00115 // cout << "Buffer:got " << _getpos << ' ' << int((unsigned char)c) << endl; 00116 BufferBase::get(c); 00117 } 00118 else setstate( BufferBase::failbit ); 00119 } 00120 00121 inline char Buffer::get() { return BufferBase::get(); } 00122 00123 inline void Buffer::put( int i, char c ) { BufferBase::put(i,c); } 00124 inline void Buffer::get( int i, char& c ) { BufferBase::get(i,c); } 00125 inline char Buffer::get( int i ) { return BufferBase::get(i); } 00126 00127 inline 00128 void Buffer::resizemax( int sizemax ) 00129 { 00130 char* tmp = new char[sizemax]; 00131 _sizemax = sizemax; 00132 for( int i = 0; i < size(); ++i ) tmp[i] = _data[i]; 00133 char* tmp2 = _data; 00134 _data = tmp; 00135 if ( tmp2 != 0 ) { delete [] tmp2; } 00136 } 00137 00138 inline 00139 void Buffer::erase() 00140 { 00141 BufferBase::erase(); 00142 resizemax(); 00143 } 00144 00145 inline 00146 const char* Buffer::c_str() 00147 { 00148 _data[_size]=0; 00149 return _data; 00150 } 00151 00152 #endif 00153
1.3.6