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