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);