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
00032
00038 #ifndef BLOCXX_STRINGSTREAM_HPP_INCLUDE_GUARD_
00039 #define BLOCXX_STRINGSTREAM_HPP_INCLUDE_GUARD_
00040 #include "blocxx/BLOCXX_config.h"
00041 #include "blocxx/StringBuffer.hpp"
00042 #include "blocxx/BaseStreamBuffer.hpp"
00043 #if defined(BLOCXX_HAVE_OSTREAM) && defined(BLOCXX_HAVE_ISTREAM)
00044 #include <istream>
00045 #include <ostream>
00046 #else
00047 #include <iostream>
00048 #endif
00049 #ifdef BLOCXX_HAVE_STREAMBUF
00050 #include <streambuf>
00051 #else
00052 #include <streambuf.h>
00053 #endif
00054
00055 namespace BLOCXX_NAMESPACE
00056 {
00057
00059 class IStringStreamBuf : public std::streambuf
00060 {
00061 public:
00062 IStringStreamBuf(const String& s)
00063 : std::streambuf()
00064 , m_buf(s)
00065 {
00066 setg(const_cast<char*>(reinterpret_cast<const char*>(m_buf.c_str())),
00067 const_cast<char*>(reinterpret_cast<const char*>(m_buf.c_str())),
00068 const_cast<char*>(reinterpret_cast<const char*>(m_buf.c_str()+m_buf.length())));
00069 }
00070 protected:
00071 int underflow()
00072 {
00073 return (gptr() < egptr()) ? static_cast<unsigned char>(*gptr()) : EOF;
00074 }
00075 private:
00076 String m_buf;
00077 };
00079 class IStringStreamBase
00080 {
00081 public:
00082 IStringStreamBase(const String& s) : m_buf(s) {}
00083 mutable IStringStreamBuf m_buf;
00084 };
00085
00087 class IStringStream : private IStringStreamBase, public std::istream
00088 {
00089 public:
00090 IStringStream(const String& s);
00091 ~IStringStream();
00092 void reset();
00093 private:
00094
00095 IStringStream(const IStringStream&);
00096 IStringStream& operator=(const IStringStream&);
00097 };
00098
00100 class BLOCXX_COMMON_API OStringStreamBuf : public BaseStreamBuffer
00101 {
00102 public:
00103 OStringStreamBuf(size_t size);
00104 virtual ~OStringStreamBuf();
00105 String toString() const;
00106
00107 String releaseString();
00108 size_t length() const;
00109 const char* c_str() const;
00110 void reset();
00111 protected:
00112 virtual int buffer_to_device(const char *c, int n);
00113 private:
00114 StringBuffer m_buf;
00115 friend class OStringStream;
00116 };
00118 class BLOCXX_COMMON_API OStringStreamBase
00119 {
00120 public:
00121 OStringStreamBase(size_t sz);
00122 mutable OStringStreamBuf m_buf;
00123 };
00125 class BLOCXX_COMMON_API OStringStream : private OStringStreamBase, public std::ostream
00126 {
00127 public:
00128 OStringStream(size_t size = 256);
00129 ~OStringStream();
00130 OStringStream(const OStringStream&);
00131 OStringStream& operator=(const OStringStream&);
00132 String toString() const;
00133
00134 String releaseString();
00135 size_t length() const;
00136 const char* c_str() const;
00137 void reset();
00138 };
00139
00140 }
00141
00142 #endif