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