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 #include <ios>
00032 #include <string>
00033 #include <iosfwd>
00034 #include <streambuf>
00035
00036 namespace more {
00037 namespace io {
00038
00039
00040
00041 template<typename Char, typename Traits>
00042 struct basic_opstreambuf
00043 : std::basic_streambuf<Char, Traits>
00044 {
00045 typedef Char char_type;
00046 typedef Traits traits_type;
00047 typedef typename Traits::int_type int_type;
00048 typedef typename Traits::pos_type pos_type;
00049 typedef typename Traits::off_type off_type;
00050
00051 basic_opstreambuf(char const*);
00052 virtual ~basic_opstreambuf();
00053 bool is_open() const { return m_fp; }
00054
00055 protected:
00056 virtual int sync();
00057 virtual int_type overflow(int_type = traits_type::eof());
00058
00059 private:
00060 static const int s_nbuf = 256;
00061
00062 void *m_fp;
00063 Char *m_buf;
00064 };
00065
00066
00067
00068 template< typename Char, typename Traits = std::char_traits<Char> >
00069 struct basic_opstream
00070 : std::basic_ostream<Char, Traits>
00071 {
00072 typedef basic_opstreambuf<Char, Traits> streambuf_type;
00073
00074 basic_opstream(char const* cmd)
00075 : std::basic_ostream<Char, Traits>(m_buf=new streambuf_type(cmd))
00076 {
00077 if (!is_open()) setstate(std::ios_base::failbit);
00078 }
00079
00080 ~basic_opstream() { delete m_buf; }
00081
00082 bool is_open() const { return m_buf->is_open(); }
00083
00084 private:
00085 streambuf_type* m_buf;
00086 };
00087
00088 typedef basic_opstream<char> opstream;
00089
00090 }
00091 }