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