Streaming library

Denis Koroskin 2korden at gmail.com
Thu Oct 14 10:42:53 PDT 2010


On Thu, 14 Oct 2010 21:31:02 +0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> On Thu, 14 Oct 2010 12:10:58 -0400, Andrei Alexandrescu  
> <SeeWebsiteForEmail at erdani.org> wrote:
>
>> On 10/14/10 11:01 CDT, Steven Schveighoffer wrote:
>>> On Thu, 14 Oct 2010 09:33:54 -0400, Denis Koroskin <2korden at gmail.com>
>>> wrote:
>>>
>>>> On Thu, 14 Oct 2010 17:24:34 +0400, Steven Schveighoffer
>>>> <schveiguy at yahoo.com> wrote:
>>>>
>>>>> On Wed, 13 Oct 2010 18:21:16 -0400, bearophile
>>>>> <bearophileHUGS at lycos.com> wrote:
>>>>>
>>>>>> Andrei:
>>>>>>
>>>>>>> Well casting from void[] is equally awkward isn't it? I'm still
>>>>>>> undecided on which is better.
>>>>>>
>>>>>> See also:
>>>>>> http://d.puremagic.com/issues/show_bug.cgi?id=4572
>>>>>>
>>>>>> Bye,
>>>>>> bearophile
>>>>>
>>>>> That issue is slightly different because std.file.read actually
>>>>> creates the buffer. In this cases, the buffer is not created, dup'd,
>>>>> concatenated, etc. so void[] offers the most flexibility.
>>>>>
>>>>> -Steve
>>>>
>>>> That is also the least safe:
>>>>
>>>> Object[] objects;
>>>> stream.read(objects); // most likely will fill with garbage
>>>>
>>>> writeln(objects[0]); // access violation
>>>>
>>>> It's a type subversion that doesn't require casts.
>>>
>>> Yes, and this is a problem.
>>>
>>> But on the flip side, requring casts for non-ubyte value types may be
>>> too restrictive. Do we want to require casts when the array being  
>>> filled
>>> is for example utf-8? If so, then won't that disallow such a function  
>>> in
>>> safe D?
>>
>> I think a solid idea would be to template streaming interfaces on any  
>> type T that has no indirections.
>
> This is a *great* idea.  This allows you to instantly use whatever type  
> you want in all calls you make, and to have the compiler enforce it.
>
> So stream becomes:
>
> interface Stream(T = ubyte) if (hasNoPointers!T)
>
> -Steve

I still favor a generic StreamReader with a templated T read() method. I  
can't think of an example where I would read one type of data from a  
stream (unless that type is a char). In many cases I read int N, followed  
by and array of floats of size N etc, followed by some other type. Do I  
need to reopen streams for that or something?

Besides, typed stream needs to be built of top of buffered stream (not an  
unbuffered one). E.g. T might be a big struct, and Stream doesn't provide  
a guaranty that it can ready exactly N bytes (think about socket stream).


More information about the Digitalmars-d mailing list