1
2#ifndef zfstream_h
3#define zfstream_h
4
5#include <fstream.h>
6#include "zlib.h"
7
8class gzfilebuf : public streambuf {
9
10public:
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
28protected:
29
30  virtual int underflow();
31  virtual int overflow( int = EOF );
32
33private:
34
35  gzFile file;
36  short mode;
37  short own_file_descriptor;
38
39  int flushbuf();
40  int fillbuf();
41
42};
43
44class 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
51public:
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
58protected:
59  gzfilestream_common();
60
61private:
62  gzfilebuf *rdbuf();
63
64  gzfilebuf buffer;
65
66};
67
68class gzifstream : public gzfilestream_common, public istream {
69
70public:
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
80class gzofstream : public gzfilestream_common, public ostream {
81
82public:
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
92template<class T> class gzomanip {
93  friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
94public:
95  gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
96private:
97  gzofstream &(*func)(gzofstream &, T);
98  T val;
99};
100
101template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
102{
103  return (*m.func)(s, m.val);
104}
105
106inline gzofstream &setcompressionlevel( gzofstream &s, int l )
107{
108  (s.rdbuf())->setcompressionlevel(l);
109  return s;
110}
111
112inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
113{
114  (s.rdbuf())->setcompressionstrategy(l);
115  return s;
116}
117
118inline gzomanip<int> setcompressionlevel(int l)
119{
120  return gzomanip<int>(&setcompressionlevel,l);
121}
122
123inline gzomanip<int> setcompressionstrategy(int l)
124{
125  return gzomanip<int>(&setcompressionstrategy,l);
126}
127
128#endif
129