
Apart from some broken links and typos in the documentation/comments, I am very impressed by the amount of work and profesional setup of the documentation and the over all design. This looks like it is a graduation project for a university or something (and perhaps it is). The only thing that really bothers me is that it seems not possible to replace std::streambuf being used by the library (ie streambuf_facade) with a custom streambuf implementation (also derived from std::streambuf of course). I'd have use for that because very likely I'd want to use my own, optimized streambuf (one that adds an interface to be able to read/write to it in a way that there is hardly ever need to actually _copy_ data, see http://libcw.sourceforge.net/io/dbstreambuf.html) Another thing that is bothering me is that the whole presence of anyting 'stream-like' (ostream/istream) seems not in the right place here. This is not only because the std::ostream/std::istream class are merely 'hooks' to hook into the operator<< and operator>> functions which are primarily intended for text (human readable representations) while this library is about binary data - but more importantly because everything this library does is related to and at the level of streambuf's (which DO have a binary interface) This fact is most apparent by considering the fact that this code should work: filtered_ostream fout; fout.push(filter); fout.push(cout); std::ostream& out(fout); // Only have/use the std::ostream base class. out << "Hello World"; // This must use the filter. A much more logical API would therefore be: filtered_streambuf fbuf; fbuf.push(filter); std::streambuf& buf(fbuf); And then using 'buf' as streambuf for some ostream of operator<< inserters are desirable. To summarize: - I think that the stream interface should be ripped out and replaced by one that is an equivalent streambuf. Providing a stream interface should be merely a 'convenience' interface and not the main API. - This streambuf interface should use a 'Streambuf' template parameter for its base class that only defaults to std::streambuf (and may demand that it is derived from std::streambuf if that is really necessary) but allows the base class to be replaced with a custom implementation. -- Carlo Wood <carlo@alinoe.com>