1 2#ifndef zfstream_h 3#define zfstream_h 4 5#include <fstream.h> 6#include "zlib.h" 7 8class gzfilebuf : public streambuf { 9 10public: 11 12 gzfilebuf( ); 13 virtual ~gzfilebuf(); 14 15 gzfilebuf *open( const char *name, int io_mode ); 16 gzfilebuf *attach( int file_descriptor, int io_mode ); 17 gzfilebuf *close(); 18 19 int setcompressionlevel( int comp_level ); 20 int setcompressionstrategy( int comp_strategy ); 21 22 inline int is_open() const { return (file !=NULL); } 23 24 virtual streampos seekoff( streamoff, ios::seek_dir, int ); 25 26 virtual int sync(); 27 28protected: 29 30 virtual int underflow(); 31 virtual int overflow( int = EOF ); 32 33private: 34 35 gzFile file; 36 short mode; 37 short own_file_descriptor; 38 39 int flushbuf(); 40 int fillbuf(); 41 42}; 43 44class gzfilestream_common : virtual public ios { 45 46 friend class gzifstream; 47 friend class gzofstream; 48 friend gzofstream &setcompressionlevel( gzofstream &, int ); 49 friend gzofstream &setcompressionstrategy( gzofstream &, int ); 50 51public: 52 virtual ~gzfilestream_common(); 53 54 void attach( int fd, int io_mode ); 55 void open( const char *name, int io_mode ); 56 void close(); 57 58protected: 59 gzfilestream_common(); 60 61private: 62 gzfilebuf *rdbuf(); 63 64 gzfilebuf buffer; 65 66}; 67 68class gzifstream : public gzfilestream_common, public istream { 69 70public: 71 72 gzifstream(); 73 gzifstream( const char *name, int io_mode = ios::in ); 74 gzifstream( int fd, int io_mode = ios::in ); 75 76 virtual ~gzifstream(); 77 78}; 79 80class gzofstream : public gzfilestream_common, public ostream { 81 82public: 83 84 gzofstream(); 85 gzofstream( const char *name, int io_mode = ios::out ); 86 gzofstream( int fd, int io_mode = ios::out ); 87 88 virtual ~gzofstream(); 89 90}; 91 92template<class T> class gzomanip { 93 friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); 94public: 95 gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } 96private: 97 gzofstream &(*func)(gzofstream &, T); 98 T val; 99}; 100 101template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m) 102{ 103 return (*m.func)(s, m.val); 104} 105 106inline gzofstream &setcompressionlevel( gzofstream &s, int l ) 107{ 108 (s.rdbuf())->setcompressionlevel(l); 109 return s; 110} 111 112inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) 113{ 114 (s.rdbuf())->setcompressionstrategy(l); 115 return s; 116} 117 118inline gzomanip<int> setcompressionlevel(int l) 119{ 120 return gzomanip<int>(&setcompressionlevel,l); 121} 122 123inline gzomanip<int> setcompressionstrategy(int l) 124{ 125 return gzomanip<int>(&setcompressionstrategy,l); 126} 127 128#endif 129