Listing 3: Class sequencebuf

#include <streambuf>

template <class Sequence>
class sequencebuf : public std::streambuf {
private:
  Sequence seq;

  enum { bufsize = 128 };
  char buf[bufsize];

public:
  sequencebuf(const Sequence& s);
  const Sequence& get_seq();

protected:
  int sync();
  int overflow(int c);
};

template <class Sequence>
sequencebuf<Sequence>::sequencebuf(const Sequence& s)
  : std::streambuf(), seq(s)
{
  setp(buf, buf + bufsize);
}

template <class Sequence>
const Sequence& sequencebuf<Sequence>::get_seq()
{
  sync();
  return seq;
}

template <class Sequence>
int sequencebuf<Sequence>::sync()
{
  seq.insert(seq.end(), pbase(), pptr());
  setp(buf, buf + bufsize);
  return 1;
}

template <class Sequence>
int sequencebuf<Sequence>::overflow(int c)
{
  sync();
  if (c != EOF) {
    *pptr() = static_cast<unsigned char>(c);
    pbump(1);
  }
  return 1;
}