StringStream.hpp

Go to the documentation of this file.
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

Generated on Fri Jun 16 15:39:09 2006 for blocxx by  doxygen 1.4.6