1 2 #ifndef zfstream_h 3 #define zfstream_h 4 5 #include <fstream.h> 6 #include "zlib.h" 7 8 class gzfilebuf : public streambuf { 9 10 public: 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 28 protected: 29 30 virtual int underflow(); 31 virtual int overflow( int = EOF ); 32 33 private: 34 35 gzFile file; 36 short mode; 37 short own_file_descriptor; 38 39 int flushbuf(); 40 int fillbuf(); 41 42 }; 43 44 class 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 51 public: 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 58 protected: 59 gzfilestream_common(); 60 61 private: 62 gzfilebuf *rdbuf(); 63 64 gzfilebuf buffer; 65 66 }; 67 68 class gzifstream : public gzfilestream_common, public istream { 69 70 public: 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 80 class gzofstream : public gzfilestream_common, public ostream { 81 82 public: 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 92 template<class T> class gzomanip { 93 friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); 94 public: 95 gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } 96 private: 97 gzofstream &(*func)(gzofstream &, T); 98 T val; 99 }; 100 101 template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m) 102 { 103 return (*m.func)(s, m.val); 104 } 105 106 inline gzofstream &setcompressionlevel( gzofstream &s, int l ) 107 { 108 (s.rdbuf())->setcompressionlevel(l); 109 return s; 110 } 111 112 inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) 113 { 114 (s.rdbuf())->setcompressionstrategy(l); 115 return s; 116 } 117 118 inline gzomanip<int> setcompressionlevel(int l) 119 { 120 return gzomanip<int>(&setcompressionlevel,l); 121 } 122 123 inline gzomanip<int> setcompressionstrategy(int l) 124 { 125 return gzomanip<int>(&setcompressionstrategy,l); 126 } 127 128 #endif