OutputRanges and slicing/save()

Jacob Carlborg doob at me.com
Sat Jan 4 03:21:58 PST 2014


On 2014-01-03 23:56, Justin Whear wrote:
> I've run into a design issue surrounding ranges and am looking for advice
> on the best way to proceed.  To illustrate the issue, consider the
> Shapefile format: a 100 byte header followed by variable-length records.
> The tricky bit is that the header includes a field which contains the
> total length of the file (as measured in 16-bit words, curiously).  The
> header must be written first, but the total length of the file isn't
> known until all the records have been encoded.  When writing to a File
> this isn't a problem: write 100 bytes of padding, write the records, use
> rewind(), and write the proper header.  It's in the context of an
> OutputRange that I don't know how to proceed.  Consider the most flexible
> range type: the array.  An array is not an OutputRange, so it needs to be
> wrapped in something like std.array.Appender.  Ideally I could save off
> the initial state of the range, write a bogus header, write the records,
> then jump back and write the proper header.  Unfortunately, Appender is
> not a ForwardRange, nor does it appear that the field of OutputRanges
> which are also ForwardRanges has been explored.  I'm using the excellent
> read, write, and append functions from std.bitmanip, so write() would fit
> the bill if only Appender supported slicing.

If you're satisfied with just using arrays and not a general output 
range you can do something similar to what you did with a file. Add the 
100 extra bytes for the header to Appender, then add the contents. 
Extract the array used for backing in the Appender and fill the proper 
header.

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list