[phobos] UnbufferedFile, or, abstracting the File ranges

Lars Tandle Kyllingstad lars at kyllingen.net
Wed May 12 00:27:04 PDT 2010


On Tue, 2010-05-11 at 11:18 -0700, Andrei Alexandrescu wrote:
> Lars Tandle Kyllingstad wrote:
> > Yeah, the ubyte functions were just examples.  My intention was to use
> > templates:
> > 
> >   size_t read(T)(ref T[] b);
> >   size_t write(T)(T[] b);
> > 
> > Then you get a sensible error message if the number of raw bytes read
> > isn't a multiple of the size of your target type.  Also, the returned
> > number is the length of the resulting array, and not the number of raw
> > bytes read.
> > 
> > Thanks for the tips! :)
> 
> That would make the functions type-unsafe. You'd need to limit T to 
> types that have no pointers (at least). Whoa, serialization rears its 
> ugly head.


But you'd have the same problem with void[], wouldn't you?  I mean, this
compiles and runs just fine:

        void read(void[] buf) { }
        
        struct S { int* p; }
        
        auto a = new S[3];
        read(a);

At least with templates one can restrict T to built-in types, and if
anyone wants to read/write compound types they can just set T to void.
This has the added advantage of making it very explicit that if you do
that, you're on your own.

Another potential gotcha with

        size_t read(void[]);
        
is that even if you pass it an array of ints, say, the return value will
still be the number of raw bytes read (which, to make matters worse, may
or may not be a multiple of int.sizeof).

I would also like to point out that all the read/write functions of
std.stdio.File, including rawRead() and rawWrite(), are templated.  Has
there been any problems with these?

-Lars



More information about the phobos mailing list