Listing 1 - Read Only String_streams

#include <iostream>

//
// Read-only String streams
//
template<typename StringT>
class iString_streambuf : public std::streambuf {
    // typedefs
    typedef std::streambuf    inherited;

public:
    iString_streambuf(StringT& str);
    virtual ~iString_streambuf();
};


// iString_stream
template<typename StringT>
class iString_stream : public std::istream {
    // types
    typedef std::istream inherited;

    // data
    iString_streambuf<StringT>    _streambuf;

public:
    iString_stream(StringT& str);
    ~iString_stream();
};


//
// implementation
//
template<typename StringT>
iString_streambuf<StringT>::iString_streambuf(StringT& str)
{
    char* gbuf = const_cast<char*>(str.data());
    setg(gbuf, gbuf, gbuf+str.size());
}


template<typename StringT>
iString_streambuf<StringT>::~iString_streambuf()
{
    // empty
}


template<typename StringT>
iString_stream<StringT>::iString_stream(StringT& str)
    : inherited(0),
    _streambuf(str)
{
    init(&_streambuf);
}


template<typename StringT>
iString_stream<StringT>::~iString_stream()
{
    // empty
}