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