00001 /******************************************************************************* 00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved. 00003 * Copyright (C) 2005 Novell, Inc. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * - Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * 00011 * - Redistributions in binary form must reproduce the above copyright notice, 00012 * this list of conditions and the following disclaimer in the documentation 00013 * and/or other materials provided with the distribution. 00014 * 00015 * - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its 00016 * contributors may be used to endorse or promote products derived from this 00017 * software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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; // need a static_cast so a -1 doesn't turn into an 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 // not implemented 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 // After calling releaseString(), this OStringStream is unusable 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 // After calling releaseString(), this OStringStream is unusable 00134 String releaseString(); 00135 size_t length() const; 00136 const char* c_str() const; 00137 void reset(); 00138 }; 00139 00140 } // end namespace BLOCXX_NAMESPACE 00141 00142 #endif
1.5.3