Home | History | Annotate | Download | only in iostream
      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( 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 
     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, const gzomanip<T> &m)
    102 {
    103   return (*m.func)(s, m.val);
    104 }
    105 
    106 inline gzofstream &setcompressionlevel( gzofstream &s, int l )
    107 {
    108   (s.rdbuf())->setcompressionlevel(l);
    109   return s;
    110 }
    111 
    112 inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
    113 {
    114   (s.rdbuf())->setcompressionstrategy(l);
    115   return s;
    116 }
    117 
    118 inline gzomanip<int> setcompressionlevel(int l)
    119 {
    120   return gzomanip<int>(&setcompressionlevel,l);
    121 }
    122 
    123 inline gzomanip<int> setcompressionstrategy(int l)
    124 {
    125   return gzomanip<int>(&setcompressionstrategy,l);
    126 }
    127 
    128 #endif
    129