Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

Buffer.h

Go to the documentation of this file.
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 

Generated on Mon May 31 21:38:43 2004 for SR2k4 Assembler by doxygen 1.3.6