$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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