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