00001
00002
00003
00004
00005
00006
00007 #ifndef BUFFERFSTREAM_H
00008 #define BUFFERFSTREAM_H
00009
00010 #ifdef USE_STD
00011 #include <iostream>
00012 #include <fstream>
00013 #include <string>
00014 using namespace std;
00015 #else
00016 #include <iostream.h>
00017 #include <fstream.h>
00018 #include <string.h>
00019 #endif
00020
00021 #include "utility.h"
00022 #include "BufferBase.h"
00023 #include "BufferfstreamManager.h"
00024
00025 class Bufferfstream : public BufferBase
00026 {
00027 public:
00028
00029 string isa() const { return "Bufferfstream"; }
00030
00031 Bufferfstream();
00032
00033 Bufferfstream( const Bufferfstream& rhs );
00034
00035 Bufferfstream( BufferBase& buf );
00036
00037 ~Bufferfstream();
00038
00039 Bufferfstream& operator = ( Bufferfstream& rhs );
00040
00041 void seekp( int pos, const BufferBase::SeekDir dir = beg );
00042 void seekg( int pos, const BufferBase::SeekDir dir = beg );
00043
00044 void put( char c );
00045 void get( char& c );
00046 char get();
00047
00048 void put( int i, char c );
00049 void get( int i, char& c );
00050 char get( int i );
00051
00052 void erase();
00053
00054 protected:
00055 int _handle;
00056 string _filename;
00057 fstream* _fs;
00058
00059 };
00060
00061 inline
00062 Bufferfstream::Bufferfstream()
00063 : BufferBase(), _fs( new fstream )
00064 {
00065 _handle = BufferfstreamManager::Instance()->get_handle();
00066 char ctmp[2*2+1];
00067 inttohex( _handle, ctmp, 2 );
00068 _filename = "~bfs";
00069 _filename += ctmp;
00070 _fs->open( _filename.c_str(), ios::out );
00071 _fs->close();
00072
00073 _fs->open( _filename.c_str(), ios::in | ios::out );
00074 }
00075
00076 inline
00077 Bufferfstream::Bufferfstream( const Bufferfstream& rhs )
00078 : BufferBase(rhs), _fs( new fstream )
00079 {
00080 _handle = BufferfstreamManager::Instance()->get_handle();
00081 char ctmp[2*2+1];
00082 inttohex( _handle, ctmp, 2 );
00083 _filename = "~bfs";
00084 _filename += ctmp;
00085 _fs->open( _filename.c_str(), ios::out );
00086 _fs->close();
00087
00088 _fs->open( _filename.c_str(), ios::in | ios::out );
00089 rhs._fs->seekg(0);
00090 for( int i = 0; i < rhs._size; ++i ) _fs->put( rhs._fs->get() );
00091 }
00092
00093 inline
00094 Bufferfstream::Bufferfstream( BufferBase& buf )
00095 : BufferBase(buf), _fs( new fstream )
00096 {
00097 _handle = BufferfstreamManager::Instance()->get_handle();
00098 char ctmp[2*2+1];
00099 inttohex( _handle, ctmp, 2 );
00100 _filename = "~bfs";
00101 _filename += ctmp;
00102 _fs->open( _filename.c_str(), ios::out );
00103 _fs->close();
00104
00105 _fs->open( _filename.c_str(), ios::in | ios::out );
00106 erase();
00107 (*this) << buf;
00108 }
00109
00110 inline
00111 Bufferfstream::~Bufferfstream()
00112 {
00113 _fs->close();
00114 if ( _fs != 0 ) { delete _fs; _fs = 0; }
00115 BufferfstreamManager::free_handle(_handle);
00116 }
00117
00118 inline
00119 Bufferfstream& Bufferfstream::operator = ( Bufferfstream& rhs )
00120 {
00121 if ( this != &rhs ) {
00122 BufferBase::operator=(rhs);
00123 erase();
00124 _fs->seekp(0);
00125 _fs->seekg(0);
00126 (*this) << rhs;
00127 }
00128 return *this;
00129 }
00130
00131 inline
00132 void Bufferfstream::seekp( int pos, BufferBase::SeekDir dir )
00133 {
00134 BufferBase::seekp( pos, dir );
00135 if ( !fail() ) _fs->seekp(_putpos);
00136 }
00137
00138 inline
00139 void Bufferfstream::seekg( int pos, BufferBase::SeekDir dir )
00140 {
00141 BufferBase::seekg( pos, dir );
00142 if ( !fail() ) _fs->seekg(_getpos);
00143 }
00144
00145 inline
00146 void Bufferfstream::put( char c )
00147 {
00148
00149 seekp(_putpos);
00150 if ( !fail() ) {
00151 _fs->put(c);
00152 BufferBase::put(c);
00153 }
00154 else setstate( BufferBase::failbit );
00155 }
00156
00157 inline
00158 void Bufferfstream::get( char& c )
00159 {
00160 seekg(_getpos);
00161 if ( !fail() ) {
00162 _fs->get(c);
00163 BufferBase::get(c);
00164
00165 }
00166 else setstate( BufferBase::failbit );
00167 }
00168
00169 inline char Bufferfstream::get() { return BufferBase::get(); }
00170
00171 inline void Bufferfstream::put(int i, char c ) { BufferBase::put(i,c); }
00172 inline void Bufferfstream::get(int i, char& c) { BufferBase::get(i,c); }
00173 inline char Bufferfstream::get(int i) { return BufferBase::get(i); }
00174
00175 inline
00176 void Bufferfstream::erase()
00177 {
00178 BufferBase::erase();
00179 _fs->close();
00180 _fs->open( _filename.c_str(), ios::out );
00181 _fs->close();
00182
00183 _fs->open( _filename.c_str(), ios::in | ios::out );
00184 }
00185
00186 #endif
00187