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
}