|
Boost : |
From: Jonathan Turkanis (technews_at_[hidden])
Date: 2004-06-02 16:17:31
"David Abrahams" <dave_at_[hidden]> wrote in message
news:ur7syb23h.fsf_at_boost-consulting.com...
> "Jonathan Turkanis" <technews_at_[hidden]> writes:
>
> > "David Abrahams" <dave_at_[hidden]> wrote in message
> >> The thing I wanted recently was an "offset streambuf", an adapter
> >> for another streambuf that presents an "offset view" (i.e. with
> >> respect to seeking) of the underlying streambuf.
> >
> > This sounds like it might be a job for a 'SeekableFilter' --
something
> > I included support for even though I didn't have any use for it.
The
> > interface for a seekable filter is basically this:
<snip>
> > Here 'next' is the streambuf being filtered. Any number of filters
can
> > be chained.
>
> I didn't really think of this as a "filtering" operation, but
anyway...
Sure, I'm just using 'filtering' as a catch-all term
<snip>
> > What exactly did you want the offset streambuf to do?
>
> I wanted to represent a region of offsets in the underlying
streambuf
> as the whole stream. So, for example,
>
>
> void operate_on_region(streambuf& s)
> {
> region_streambuf s1(s, 500, 1000); // a stream over 500 bytes
of s
> s1.pubseekpos(10); // I probably don't have this call quite
right
> traits::int_type c = s1.sbumpc(); // reads byte 510 from s
> }
This fits nicely into the framework, with one caveat, noted below.
> struct seekable_filter {
> // some typedefs
> streamsize read(char* s, streamsize n, streambuf& next);
> void write(const char* s, streamsize n, streambuf& next);
> streamoff seek(streamoff off, ios_base::seekdir way,
> streambuf& next);
> };
The filter would start by seeking to the first offset. Reads and
writes would delegate to next after adjusting the streamsize argument,
if needed. Seeks using ios_bas::cur would delegate to next, after
checking that they stay within the given bounds. Seeks using
ios_base::beg or ios_base::end would adjust the streamoff argument
before delegating.
The caveat is that seeking with respect to stream positions -- i.e.
values of type traits_type::pos_type rather than
traits_type::off_type -- only works as expected for positions which
are equivalent to integral offsets. Free ranging random access doesn't
make much sense in multibyte streams, anyway. There's a more limited
type of random access which is possible in multibyte streams, in which
you can save a position and go back to it later. I've chosen not to
support this, however.
Jonathan
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk