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

Bufferfstream.h

Go to the documentation of this file.
00001 // Bufferfstream.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
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 //   _fs->open( _filename.c_str(), ios::in | ios::app );
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 //   _fs->open( _filename.c_str(), ios::in | ios::app );
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 //   _fs->open( _filename.c_str(), ios::in | ios::app );
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 //   cout << "Bufferfstream::puting " << _putpos << ' ' << int((unsigned char)c) << endl;
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 //      cout << "Bufferfstream::got " << _fs->tellg()-1 << ' ' << int((unsigned char)c) << endl;
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 //   _fs->open( _filename.c_str(), ios::in | ios::app );
00183    _fs->open( _filename.c_str(), ios::in | ios::out );
00184 }
00185 
00186 #endif
00187 

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