diff options
Diffstat (limited to 'contrib/iostream/zfstream.h')
-rw-r--r-- | contrib/iostream/zfstream.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/contrib/iostream/zfstream.h b/contrib/iostream/zfstream.h new file mode 100644 index 0000000..c87fa08 --- /dev/null +++ b/contrib/iostream/zfstream.h | |||
@@ -0,0 +1,142 @@ | |||
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( short comp_level ); | ||
20 | int setcompressionstrategy( short 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, | ||
102 | const gzomanip<T> &m) { | ||
103 | return (*m.func)(s, m.val); | ||
104 | |||
105 | } | ||
106 | |||
107 | inline gzofstream &setcompressionlevel( gzofstream &s, int l ) { | ||
108 | (s.rdbuf())->setcompressionlevel(l); | ||
109 | return s; | ||
110 | } | ||
111 | |||
112 | inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) { | ||
113 | (s.rdbuf())->setcompressionstrategy(l); | ||
114 | return s; | ||
115 | } | ||
116 | |||
117 | inline gzomanip<int> setcompressionlevel(int l) | ||
118 | { | ||
119 | return gzomanip<int>(&setcompressionlevel,l); | ||
120 | } | ||
121 | |||
122 | inline gzomanip<int> setcompressionstrategy(int l) | ||
123 | { | ||
124 | return gzomanip<int>(&setcompressionstrategy,l); | ||
125 | } | ||
126 | |||
127 | #endif | ||
128 | |||
129 | |||
130 | |||
131 | |||
132 | |||
133 | |||
134 | |||
135 | |||
136 | |||
137 | |||
138 | |||
139 | |||
140 | |||
141 | |||
142 | |||