mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-30 16:33:01 +00:00
128 lines
2.4 KiB
C++
128 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
|