9e052883 |
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 |