On Thu, 14 Oct 2010 22:21:37 +0400, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Thu, 14 Oct 2010 13:42:53 -0400, Denis Koroskin <2kor...@gmail.com> wrote:

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

On Thu, 14 Oct 2010 12:10:58 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

On 10/14/10 11:01 CDT, Steven Schveighoffer wrote:
On Thu, 14 Oct 2010 09:33:54 -0400, Denis Koroskin <2kor...@gmail.com>
wrote:

On Thu, 14 Oct 2010 17:24:34 +0400, Steven Schveighoffer
<schvei...@yahoo.com> wrote:

On Wed, 13 Oct 2010 18:21:16 -0400, bearophile
<bearophileh...@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?

No, you just use the default (ubyte) and use casts like you said earlier.

But char, wchar, dchar should also be possible types. I can't see huge needs for using something like uint or float, but it's there for free.

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

Hm... you are right, you'd have to buffer at least one T in order for this to work. That kind of sucks. This rules out wchar and char. Maybe it's better to allow all T's where T.sizeof is 1 (this rules out pointer types anyways). Andrei?

-Steve

What's point of having multiple types that only differ with read signature? When would you prefer Stream!(byte) over Stream!(ubyte) or Stream!(char)? What's wrong with an adapter that allows you to read any kind of data off the stream?

Why do you need to use a Stream directly for reading an array of e.g. ints off the stream? Save your time, don't write duplicated code. Use an adapter specially provided for that purpose.

Reply via email to