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 
is_open()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:
gzomanip(gzofstream & (* f)(gzofstream &,T),T v)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 
setcompressionlevel(gzofstream & s,int l)106 inline gzofstream &setcompressionlevel( gzofstream &s, int l )
107 {
108   (s.rdbuf())->setcompressionlevel(l);
109   return s;
110 }
111 
setcompressionstrategy(gzofstream & s,int l)112 inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
113 {
114   (s.rdbuf())->setcompressionstrategy(l);
115   return s;
116 }
117 
setcompressionlevel(int l)118 inline gzomanip<int> setcompressionlevel(int l)
119 {
120   return gzomanip<int>(&setcompressionlevel,l);
121 }
122 
setcompressionstrategy(int l)123 inline gzomanip<int> setcompressionstrategy(int l)
124 {
125   return gzomanip<int>(&setcompressionstrategy,l);
126 }
127 
128 #endif
129