00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef MORE_BITS_FDSTREAMBUF_H
00032 #define MORE_BITS_FDSTREAMBUF_H
00033
00034
00035 #include <ios>
00036 #include <iosfwd>
00037 #include <streambuf>
00038
00039
00040
00041 namespace more {
00042 namespace io {
00043
00044
00045 namespace bits {
00046
00047 template<typename CharT, typename Traits>
00048 struct basic_fdstreambuf
00049 : std::basic_streambuf<CharT, Traits>
00050 {
00051 typedef CharT char_type;
00052 typedef Traits traits_type;
00053 typedef typename Traits::int_type int_type;
00054 typedef typename Traits::pos_type pos_type;
00055 typedef typename Traits::off_type off_type;
00056
00057 basic_fdstreambuf(int fd_in_ = -1, int fd_out_ = -1)
00058 : fd_in(fd_in_), fd_out(fd_out_) {
00059 #ifdef MORE_BITS_FDSTREAMBUF_INLINE_STORAGE
00060 setg(buf_get, buf_get, buf_get);
00061 setp(buf_put, buf_put+nbuf_put);
00062 #else
00063 setg(0, 0, 0);
00064 setp(0, 0);
00065 #endif
00066 }
00067 virtual ~basic_fdstreambuf();
00068
00069 void set_fd_in(int fd) { setg(eback(), eback(), eback()); fd_in = fd; }
00070 void set_fd_out(int fd) { sync(); fd_out = fd; }
00071 void set_fd_io(int fd) {
00072 setg(eback(), eback(), eback());
00073 sync();
00074 fd_in = fd_out = fd;
00075 }
00076
00077 protected:
00078 virtual int sync();
00079 virtual int_type overflow(int_type = traits_type::eof());
00080 virtual int_type underflow();
00081
00082 private:
00083 int fd_in, fd_out;
00084 static const int nbuf_put = 512;
00085 static const int nbuf_get = 512;
00086 #ifdef MORE_BITS_FDSTREAMBUF_INLINE_STORAGE
00087 char buf_put[nbuf_put];
00088 char buf_get[nbuf_get];
00089 #endif
00090 };
00091
00092 typedef basic_fdstreambuf< char, std::char_traits<char> > fdstreambuf;
00093 }
00094
00095
00096 }
00097 }
00098
00099 #endif