bzstream.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef s11n_BZSTREAM_H_INCLUDED
00039 #define s11n_BZSTREAM_H_INCLUDED 1
00040
00041
00042
00043 #include <iostream>
00044 #include <fstream>
00045
00046 #include <bzlib.h>
00047
00048
00049 #ifndef ZSTREAM_NAMESPACE
00050 #define ZSTREAM_NAMESPACE s11n
00051 #endif
00052
00053 #ifdef ZSTREAM_NAMESPACE
00054 namespace ZSTREAM_NAMESPACE
00055 {
00056 #endif
00057
00058
00059
00060
00061 class bzstreambuf:public std::streambuf
00062 {
00063 private:
00064 static const int bufferSize = 47 + 256;
00065
00066
00067 BZFILE * file;
00068 char buffer[bufferSize];
00069 char opened;
00070 int mode;
00071
00072 int flush_buffer( );
00073 public:
00074 bzstreambuf( ):opened( 0 ), m_zlevel(-1)
00075 {
00076 setp( buffer, buffer + ( bufferSize - 1 ) );
00077 setg( buffer + 4,
00078 buffer + 4,
00079 buffer + 4 );
00080
00081 }
00082 int is_open( )
00083 {
00084 return opened;
00085 }
00086 bzstreambuf *open( const char *name, int open_mode );
00087 bzstreambuf *close( );
00088 ~bzstreambuf( )
00089 {
00090 close( );
00091 }
00092
00093 virtual int overflow( int c = EOF );
00094 virtual int underflow( );
00095 virtual int sync( );
00096
00097
00098
00099
00100
00101 void zlevel( int z ) { this->m_zlevel = ( z<0 ? -1 : (z>9?9:z) ) ; }
00102
00103
00104
00105 int zlevel() const { return this->m_zlevel; }
00106 private:
00107 int m_zlevel;
00108 };
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 class bzstreambase:virtual public std::ios
00119 {
00120 private:
00121 int m_zlevel;
00122 protected:
00123 bzstreambuf buf;
00124 public:
00125 bzstreambase( )
00126 {
00127 init( &buf );
00128 }
00129 bzstreambase( const char *name, int open_mode );
00130 ~bzstreambase( );
00131 void open( const char *name, int open_mode );
00132 void close( );
00133
00134 void zlevel( int z ) { buf.zlevel(z); }
00135 int zlevel() const { return buf.zlevel(); }
00136
00137 bzstreambuf *rdbuf( )
00138 {
00139 return &buf;
00140 }
00141 };
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 class ibzstream:public bzstreambase, public std::istream
00152 {
00153 public:
00154 ibzstream( ):std::istream( &buf )
00155 {
00156 }
00157 ibzstream( const char *name, int open_mode = std::ios::in ):bzstreambase( name, open_mode ), std::istream( &buf )
00158 {
00159 }
00160 bzstreambuf *rdbuf( )
00161 {
00162 return bzstreambase::rdbuf( );
00163 }
00164 void open( const char *name, int open_mode = std::ios::in )
00165 {
00166 bzstreambase::open( name, open_mode );
00167 }
00168 };
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 class obzstream:public bzstreambase, public std::ostream
00180 {
00181 public:
00182 obzstream( ):std::ostream( &buf )
00183 {
00184 }
00185 obzstream( const char *name, int mode = std::ios::out ):bzstreambase( name, mode ), std::ostream( &buf )
00186 {
00187 }
00188 bzstreambuf *rdbuf( )
00189 {
00190 return bzstreambase::rdbuf( );
00191 }
00192 void open( const char *name, int open_mode = std::ios::out )
00193 {
00194 bzstreambase::open( name, open_mode );
00195 }
00196 };
00197
00198 #ifdef ZSTREAM_NAMESPACE
00199 }
00200 #endif
00201
00202 #endif // s11n_BZSTREAM_H_INCLUDED
00203
00204
Generated on Tue Jul 20 10:46:47 2004 for s11n by
1.3.7