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