istringstream_nocopy: Implement in a standards-compliant way

Fixes #1135.
This commit is contained in:
Shea Levy 2016-11-17 10:10:32 -05:00
parent 3f4d3f8a1a
commit 0d2ebb4373

View file

@ -435,14 +435,50 @@ void callSuccess(
argument. This is useful for large strings. The caller must ensure
that the string object is not destroyed while it's referenced by
this object. */
struct istringstream_nocopy : public std::stringstream
class istringbuf_nocopy : public std::streambuf
{
istringstream_nocopy(const std::string & s)
const std::string & s;
std::streamsize off;
public:
istringbuf_nocopy(const std::string & s) : s{s}, off{0}
{
rdbuf()->pubsetbuf(
(char *) s.data(), s.size());
}
private:
int_type underflow()
{
if (off == s.size())
return traits_type::eof();
return traits_type::to_int_type(s[off]);
}
int_type uflow()
{
if (off == s.size())
return traits_type::eof();
return traits_type::to_int_type(s[off++]);
}
int_type pbackfail(int_type ch)
{
if (off == 0 || (ch != traits_type::eof() && ch != s[off - 1]))
return traits_type::eof();
return traits_type::to_int_type(s[--off]);
}
std::streamsize showmanyc()
{
return s.size() - off;
}
};
struct istringstream_nocopy : public std::istream
{
istringbuf_nocopy buf;
istringstream_nocopy(const std::string & s) : std::istream(&buf), buf(s) {};
};
}