Hello,
Some days ago, I decided that it would be fun to write a streambuf
subclass that would use mmap
and read-ahead.
I looked at how my STL (SGI) implemented filebuf
and realized that basic_filebuf
contains a FILE*
. So inheriting from basic_filebuf
is out of the question.
So I inherited from basic_streambuf
. Then i wanted to bind my mmapbuf
to a fstream.
I thought the only thing that I would have to do would be to copy the implicit interface of filebuf
... but that was a clear mistake. In the SGI, basic_fstream
owns a basic_filebuf
. No matter if I call basic_filestream.std::::ios::rdbuf( streambuf* )
, the filestream completely ignores it and uses its own filebuf
.
So now I'm a bit confused... sure, I can create my own mmfstream
, that would be the exact copy/paste of the fstream
but that sounds really not DRY-oriented.
What I can't understand, is: why does fstream
is so tightly coupled with filebuf
, so that it is not possible to use anything else than a filebuf
? The whole point of separating streams and bufs is that one can use a stream with a different buffer.
Solutions:
=> filestream
should rely on the implicit interface of filebuf
. That is, fstream should be templated by a streambuf class. That would allow everyone to provide its own streambuf subclass to a fstream
as long as it implements filebuf
's implicit interface. Problem: we cannot add a template parameter to fstream
since it would break template selectors while using fstream
as template template parameter.
=> filebuf
should be a pure virtual class without any additional attributes. So that one can inherit from it without carrying all its FILE* garbage.
Your ideas on the subject ?