00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00018 #ifndef __DERS__BUF_RDWR_HPP__
00019 #define __DERS__BUF_RDWR_HPP__
00020 
00021 #include <ders/config.hpp>
00022 #include <ders/text.hpp>
00023 
00024 namespace ders {  
00025 
00029 class readable : virtual public destroyable {
00030  public:
00031       virtual int read(void* buf, int n)=0;
00032 };
00033 
00037 class writable : virtual public destroyable {
00038  public:
00039       virtual int write(const void* buf, int n)=0;
00040 };
00041 
00046 class buf_reader {
00047       mem_pool& mp;
00048       readable& rd;
00049       unsigned char* buf;
00050       int bsz;
00051       int it, lim;
00052 
00053       int read_impl();
00054 
00055       buf_reader(const buf_reader&);
00056       buf_reader& operator=(const buf_reader&);
00057 
00058  public:
00059       buf_reader(mem_pool& m, readable& rdbl, int bufsz=4*1024);
00060       ~buf_reader() { mp.deallocate(buf, bsz); }
00061 
00062       int read(void* b, int n);
00063       int read(sh_text& buf, int n);
00064       int read() { return (it<lim) ? buf[it++] : read_impl(); }
00065       bool read_line(sh_text& line, bool noendl=true);
00066 
00067       void reset() { it=lim=0; }
00068 
00069       const char* begin() const { return reinterpret_cast<char*>(buf)+it; }
00070       const char* end() const { return reinterpret_cast<char*>(buf)+lim; }
00071 };
00072 
00077 class buf_writer {
00078       mem_pool& mp;
00079       writable& wr;
00080       unsigned char* buf;
00081       int bsz;
00082       int it;
00083 
00084       int write_impl(char ch);
00085 
00086       buf_writer(const buf_writer&);
00087       buf_writer& operator=(const buf_writer&);
00088 
00089  public:
00090       buf_writer(mem_pool& m, writable& wrbl, int bufsz=4*1024);
00091       ~buf_writer();
00092 
00093       int write(const void* b, int n);
00094       int write(const ch_rng& r) { return write(r.beg, r.size()); }
00095       int write(char ch) { return (it<bsz) ? buf[it++]=ch : write_impl(ch); }
00096       bool flush();
00097 
00098       void reset() { it=0; }
00099 
00100       const char* begin() const { return reinterpret_cast<char*>(buf); }
00101       const char* end() const { return reinterpret_cast<char*>(buf)+it; }
00102 };
00103 
00104 }  
00105 
00106 #endif  // __DERS__BUF_RDWR_HPP__
00107