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