00001 #ifndef DEMO_FILTERSTREAMBUF_H
00002 #define DEMO_FILTERSTREAMBUF_H
00003
00004
00005 #include <iostream>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 template <class Filter>
00024 class FilterStreambuf: public std::streambuf {
00025 public:
00026
00027
00028
00029
00030
00031 explicit FilterStreambuf(Filter& filter): filter_(filter) {
00032 setg(inbuf_,inbuf_+1,inbuf_+1);
00033 setp(0,0);
00034 }
00035
00036
00037 virtual ~FilterStreambuf() {}
00038
00039
00040 const Filter& filter() const { return filter_; }
00041 Filter& filter() { return filter_; }
00042
00043
00044 FilterStreambuf& filter(Filter& filter) { filter_ = filter; return *this; }
00045
00046
00047 bool close() { int tmp=sync(); filter_.close(); return tmp; }
00048
00049 protected:
00050
00051
00052 virtual int sync() { return filter_.sync(); }
00053 virtual int underflow() {
00054 if (gptr()<egptr())
00055 return *gptr();
00056 if ( (inbuf_[0] = filter_.get()) != EOF)
00057 setg(inbuf_,inbuf_,inbuf_+1);
00058 return inbuf_[0];
00059 }
00060 virtual int overflow(int c) { return filter_.put(c); }
00061
00062 private:
00063 char inbuf_[1];
00064 Filter& filter_;
00065 };
00066
00067 #endif