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 argument. This is useful for large strings. The caller must ensure
that the string object is not destroyed while it's referenced by that the string object is not destroyed while it's referenced by
this object. */ 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) {};
};
} }