|  | 
 | #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 |