On Mon, 2010-08-16 at 09:55 +0100, Julian Foad wrote:
> On Sat, 2010-08-14, stef...@apache.org wrote:
> > Log:
> > Extend the stream API by three functions:
> > svn_stream_move_mark() to move an existing mark by some delta
> 
> Hi Stefan.
> 
> Unfortunately this is not a logical extension to the stream API.
> Subversion's svn_stream_t streams support arbitrary "filtering" or
> "translation" tasks that require a mostly sequential processing of the
> stream.  One of the ideas embodied by the "get a mark" and "seek to a
> mark" paradigm is that the stream position is not expressible by a
> simple number (such as a byte offset from the start), because the stream
> may be performing translation whose state at a given position depends on
> the preceding content of the stream.  Therefore "get a mark" does not
> return a scalar number but instead returns a stream state object which
> contains the translation state of the stream as well as the "mark" of
> the underlying stream if there is one.
> 
> Seeking to an arbitrary new position requires telling the stream all of
> its relevant internal state at that position.  "Move by +/- N bytes"
> does not seem to be an operation that can be supported.

... supported by all streams that support mark & seek.  Of course some
streams could support it.

I don't like to see an API be complicated by lots of functions that may
or may not be supported, and functions to find out whether they are
supported.  I would ask you to look for another way to realize most of
the speed gain that you were hoping to get from this extension.

- Julian


[...]
> > +/** Returns @c TRUE if the generic @a stream supports svn_stream_mark().
> > + *
> > + * @see svn_stream_mark()
> > + * @since New in 1.7.
> > + */
> > +svn_boolean_t
> > +svn_stream_supports_mark(svn_stream_t *stream);
> > +
> >  /** Set a @a mark at the current position of a generic @a stream,
> >   * which can later be sought back to using svn_stream_seek().
> >   * The @a mark is allocated in @a pool.
> > @@ -1102,6 +1142,27 @@ svn_stream_mark(svn_stream_t *stream,
> >  svn_error_t *
> >  svn_stream_seek(svn_stream_t *stream, svn_stream_mark_t *mark);
> >  
> > +/** Move a @a mark for a generic @a stream by delta.
> > + * This function returns the #SVN_ERR_STREAM_SEEK_NOT_SUPPORTED error
> > + * if the stream doesn't implement seeking.
> > + *
> > + * @see svn_stream_mark()
> > + * @since New in 1.7.
> > + */
> > +svn_error_t *
> > +svn_stream_move_mark(svn_stream_t *stream, 
> > +                     svn_stream_mark_t *mark, 
> > +                     apr_off_t delta);



Reply via email to