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