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