
Coroutines or threads are overkill for this problem, IMHO. What you need is laziness, as in haskell. FC++ probably can handle decompress with less overhead than threads. Bruno Martinez On Thu, 13 Jan 2005 16:12:44 -0700, Jonathan Turkanis <technews@kangaroologic.com> wrote:
If we want to preserve the simplcity of the example without requiring that an enitre stream of data be processed at once, we could switch to thread-aware concepts. E.g.,
template<typename AsyncSource, typename AsynSink> void decompress(AsyncSource& in, AsynSink& out) { char c; while((c = boost::io::blocking_get(in)) != EOF) { if(c == 0xFF) { int len = boost::io::blocking_get(in); if(!in || !boost::io::blocking_get(in)) // Return an error. while(len--) boost::io::blocking_put(out, c); } else { boost::io::blocking_put(out, c); } } }
(I've been planning to introduce such concepts eventually, but definitely not in the initial release.)
With some sacrifice of efficiency, we could even use your example unchanged, and stipulate that the provided istream and ostream wait on some synchronization object until input is available or EOF is reached (for the istream) or until the output buffers have free space (for the ostream).
In short, I 'm not sure the co_filter idea can be implemented without some cost in efficiency or simplicity.