|  |  | 
|  | #ifndef zfstream_h | 
|  | #define zfstream_h | 
|  |  | 
|  | #include <fstream.h> | 
|  | #include "zlib.h" | 
|  |  | 
|  | class gzfilebuf : public streambuf { | 
|  |  | 
|  | public: | 
|  |  | 
|  | gzfilebuf( ); | 
|  | virtual ~gzfilebuf(); | 
|  |  | 
|  | gzfilebuf *open( const char *name, int io_mode ); | 
|  | gzfilebuf *attach( int file_descriptor, int io_mode ); | 
|  | gzfilebuf *close(); | 
|  |  | 
|  | int setcompressionlevel( int comp_level ); | 
|  | int setcompressionstrategy( int comp_strategy ); | 
|  |  | 
|  | inline int is_open() const { return (file !=NULL); } | 
|  |  | 
|  | virtual streampos seekoff( streamoff, ios::seek_dir, int ); | 
|  |  | 
|  | virtual int sync(); | 
|  |  | 
|  | protected: | 
|  |  | 
|  | virtual int underflow(); | 
|  | virtual int overflow( int = EOF ); | 
|  |  | 
|  | private: | 
|  |  | 
|  | gzFile file; | 
|  | short mode; | 
|  | short own_file_descriptor; | 
|  |  | 
|  | int flushbuf(); | 
|  | int fillbuf(); | 
|  |  | 
|  | }; | 
|  |  | 
|  | class gzfilestream_common : virtual public ios { | 
|  |  | 
|  | friend class gzifstream; | 
|  | friend class gzofstream; | 
|  | friend gzofstream &setcompressionlevel( gzofstream &, int ); | 
|  | friend gzofstream &setcompressionstrategy( gzofstream &, int ); | 
|  |  | 
|  | public: | 
|  | virtual ~gzfilestream_common(); | 
|  |  | 
|  | void attach( int fd, int io_mode ); | 
|  | void open( const char *name, int io_mode ); | 
|  | void close(); | 
|  |  | 
|  | protected: | 
|  | gzfilestream_common(); | 
|  |  | 
|  | private: | 
|  | gzfilebuf *rdbuf(); | 
|  |  | 
|  | gzfilebuf buffer; | 
|  |  | 
|  | }; | 
|  |  | 
|  | class gzifstream : public gzfilestream_common, public istream { | 
|  |  | 
|  | public: | 
|  |  | 
|  | gzifstream(); | 
|  | gzifstream( const char *name, int io_mode = ios::in ); | 
|  | gzifstream( int fd, int io_mode = ios::in ); | 
|  |  | 
|  | virtual ~gzifstream(); | 
|  |  | 
|  | }; | 
|  |  | 
|  | class gzofstream : public gzfilestream_common, public ostream { | 
|  |  | 
|  | public: | 
|  |  | 
|  | gzofstream(); | 
|  | gzofstream( const char *name, int io_mode = ios::out ); | 
|  | gzofstream( int fd, int io_mode = ios::out ); | 
|  |  | 
|  | virtual ~gzofstream(); | 
|  |  | 
|  | }; | 
|  |  | 
|  | template<class T> class gzomanip { | 
|  | friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); | 
|  | public: | 
|  | gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } | 
|  | private: | 
|  | gzofstream &(*func)(gzofstream &, T); | 
|  | T val; | 
|  | }; | 
|  |  | 
|  | template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m) | 
|  | { | 
|  | return (*m.func)(s, m.val); | 
|  | } | 
|  |  | 
|  | inline gzofstream &setcompressionlevel( gzofstream &s, int l ) | 
|  | { | 
|  | (s.rdbuf())->setcompressionlevel(l); | 
|  | return s; | 
|  | } | 
|  |  | 
|  | inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) | 
|  | { | 
|  | (s.rdbuf())->setcompressionstrategy(l); | 
|  | return s; | 
|  | } | 
|  |  | 
|  | inline gzomanip<int> setcompressionlevel(int l) | 
|  | { | 
|  | return gzomanip<int>(&setcompressionlevel,l); | 
|  | } | 
|  |  | 
|  | inline gzomanip<int> setcompressionstrategy(int l) | 
|  | { | 
|  | return gzomanip<int>(&setcompressionstrategy,l); | 
|  | } | 
|  |  | 
|  | #endif |