home *** CD-ROM | disk | FTP | other *** search
/ Freelog 11 / Freelog011.iso / Bas / Compression / ZLib / contrib / iostream / zfstream.h < prev   
C/C++ Source or Header  |  1997-04-30  |  3KB  |  143 lines

  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( short comp_level );
  20.   int setcompressionstrategy( short 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,
  102.                      const gzomanip<T> &m) {
  103.   return (*m.func)(s, m.val);
  104.   
  105. }
  106.  
  107. inline gzofstream &setcompressionlevel( gzofstream &s, int l ) {
  108.   (s.rdbuf())->setcompressionlevel(l);
  109.   return s;
  110. }
  111.  
  112. inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) {
  113.   (s.rdbuf())->setcompressionstrategy(l);
  114.   return s;
  115. }
  116.  
  117. inline gzomanip<int> setcompressionlevel(int l)
  118. {
  119.   return gzomanip<int>(&setcompressionlevel,l);
  120. }
  121.  
  122. inline gzomanip<int> setcompressionstrategy(int l)
  123. {
  124.   return gzomanip<int>(&setcompressionstrategy,l);
  125. }
  126.  
  127. #endif
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.