streaming redux

Daniel Gibson metalcaedes at gmail.com
Mon Jan 3 13:42:35 PST 2011


Am 31.12.2010 15:43, schrieb Steven Schveighoffer:
> On Fri, 31 Dec 2010 03:28:12 -0500, Daniel Gibson
> <metalcaedes at gmail.com> wrote:
>
>> Am 30.12.2010 23:17, schrieb Andrei Alexandrescu:
>>> On 12/30/10 3:59 PM, Dmitry Olshansky wrote:
>>>> On 28.12.2010 16:08, Daniel Gibson wrote:
>>>> [snip]
>>>>> ## UnbufferedInputTransport:
>>>>>
>>>>> I'd like "void readFully(ubyte[] buffer)" which reads buffer.length
>>>>> bytes or throws an exception if that is not possible
>>>>> This would also fix busy-waiting (it'd block until buffer.length bytes
>>>>> are available).
>>>>>
>>>>> Also "size_t read(void* buffer, size_t length)" (and the same for
>>>>> readFully()) would be nice, so one can read from the stream to buffers
>>>>> of arbitrary type without too much casting. Is probably especially
>>>>> handy when used with (data from) extern(C) functions and such.
>>>>>
>>>>> Also, for convenience: "ubyte[] read(size_t length)" (does something
>>>>> like "return read(new ubyte[length]);"
>>>>> and "ubyte[] readFully(size_t length)"
>>>>
>>>> This, I guess, would be provided by free functions in the same module,
>>>> there is no point in requiring to implement them inside the stream
>>>> itself.
>>>>>
>>>>> ## UnbufferedOutputTransport:
>>>>>
>>>>> I'd like "void write(void *buffer, size_t length)" - for the same
>>>>> reason as read(void* buffer, size_t length).
>>>>
>>>> Ditto
>>>
>>> What's wrong with void[]?
>>>
>>> Andrei
>>
>> For example:
>>
>> void put(int i) {
>> write(&i, int.sizeof);
>> }
>>
>> is shorter and easier than
>>
>> void put(int i) {
>> void *tmp = cast(void*)(&i);
>> void[] arr = tmp[0..int.sizeof];
>> write(arr);
>> }
>
> This can be significantly shortened:
>
> write((&i)[0..1]);
>
> Remember, all arrays implicitly cast to void[], which is why you use it
> for input parameters.
>
> -Steve

This is indeed a very cool trick :-)


More information about the Digitalmars-d mailing list