129 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#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
 |