Streaming library

Steven Schveighoffer schveiguy at yahoo.com
Thu Oct 14 10:31:02 PDT 2010


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


More information about the Digitalmars-d mailing list