Boost logo

Boost Users :

From: Jonathan Turkanis (technews_at_[hidden])
Date: 2005-09-19 12:45:02


Marcus Alanen wrote:
> Jonathan Turkanis wrote:
>
>> This is a nice idea. IMO, the best way to implement it would be as a
>> filter -- perhaps you could call it a stream_signature_filter. You
>> might use it as follows:
>>
>> stream_signature_filter f;
>> f.push("GZIP", gzip_decompressor());
>> f.push("BZh", bzip2_decompressor());
>> filtering_istreambuf in(f);
>> in.push(file("archive.tar.gz"));
>>
>> You could then define filters derived from stream_signature_filter
>> that have preset mappings from signatures to filters.

> Then again, perhaps the stream_signature_filter should just try out
> each decompressor in turn, and whichever does not throw an exception
> should be allowed to continue.

This doesn't generalize well to non-compression filters. Many filters can handle
any stream of data without throwing an exception, even if it's not what the user
expects.

> Please allow it to stream through
> unknown compression schemes, especially uncompressed files :-)

The way I'd handle this would be to allow signatures to contain wildcard
characters, which is necessary anyway for some file formats. Then you could
write:

   stream_signature_filter f;
   f.push("GZIP", gzip_decompressor());
   f.push("BZh", bzip2_decompressor());
   f.push("?", identity_filter()); // Wildcard
   filtering_istreambuf in(f);
   in.push(file("archive.tar.gz"));

This reminds me: despite the algebraic flavor of some of the existing components
(null_source, inverse, ...) I never implemented an identity filter.

>> I'll add this to my list of ideas of 1.34.
>
> Excellent, thank you!
>
> Marcus

Jonathan


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net