небуферизованная реализация std streambuf - PullRequest
4 голосов
/ 18 августа 2011

для быстрого тестирования библиотеки сериализации я хочу создать потоковый буфер, который может читать / записывать в / из сокета. Я не хочу использовать буфер в streambuf, но пусть сокет обрабатывает это. Я уверен, что библиотека сериализации будет вызывать только std::istream::read и std::ostream::write. Беглый взгляд на реализацию basic_streambuf от Microsoft показывает, что эти вызовы практически напрямую перенаправляются на xsputn и xsgetn.

Вопрос в том, могу ли я наследовать от streambuf и просто реализовать xsputn и xsgetn, и быть уверенным, что потоки, использующие мою реализацию, всегда будут вызывать эти методы, а не sync / overflow / underflow / pback / ...? Или же мне следует переопределить синхронизацию и т. Д. Для возврата ошибок, или стандарт гарантирует, что реализации по умолчанию в порядке? Предпочтительно это должно работать на любой распространенной платформе, и я не могу использовать boost :: iostreams.

Практически я бы использовал что-то вроде этого:

class socket_buf : public std::streambuf
{
public:
    //Socket is a class with std::stream-like read/write methods
  MyBuf( Socket& s ) : sock( s ) {}

protected:
  std::streamsize xsputn( const char* s, std::streamsize n )
  {
    return sock.write( s, n );
  }

  std::streamsize xsgetn( char* s, std::streamsize n )
  {
    return sock.read( s, n );
  }

private:
  Socket& sock;
};

1 Ответ

6 голосов
/ 18 августа 2011

(почти?) Невозможно реализовать std::streambuf без буфера. Вам придется перегружать underflow и overflow, так как многие открытые интерфейсы к std::streambuf не будут проходить через xsputn или xsgetn. Например. sputc, sbumpc и т. Д. Даже sputn не гарантирует вызова xsputn в зависимости от состояния внутреннего буфера и конкретной реализации std::streambuf.

...