Conversion to output ranges

Mafi mafi at example.org
Wed Feb 8 09:35:55 PST 2012


Am 07.02.2012 16:50, schrieb Timon Gehr:
> On 02/07/2012 04:49 PM, Timon Gehr wrote:
>> On 02/07/2012 02:35 PM, Mafi wrote:
>>> Hi,
>>> does anybody know how to bring std.conv.to or something similar to
>>> output into an output range?
>>>
>>> int a = 42;
>>> char[25] buffer;
>>> to!typeof(buffer[])(a, buffer[]);
>>>
>>> I want to send these texts throw sockets. Therefore I'd like to reuse
>>> the buffer.
>>>
>>> Mafi
>>
>> You could use std.format.formattedWrite.
>>
>> import std.exception, std.format, std.stdio;
>>
>> // I don't know if this already exists somewhere:
>> struct Filler(T:T[]){
>> this(T[] pl){payload = pl;}
>> size_t index=0;
>> T[] payload;
>> void put(const T[] s){
>> enforce(payload.length>=index+s.length);
>> payload[index..index+s.length]=s;
>> index+=s.length;
>> }
>> void put(char s){
>
> Should be 'void put(T s)'.
>
>> enforce(payload.length>=index);
>> payload[index++]=s;
>> }
>> @property auto data(){return payload[0..index];}
>> }
>> auto filler(T)(T pl){return Filler!T(pl);}
>>
>> void main(){
>> int a = 42;
>> char[25] buffer;
>> auto f = filler(buffer[]);
>> formattedWrite(&f,"%s",a);
>> writeln(f.data);
>> }
>

Thanks :) This solution seems to work.
I just wanted to point out that I forgot the ampersand and this was hard 
to track down. I seemed to work but index wasn't incremented so I always 
got an empty slice.

Mafi


More information about the Digitalmars-d-learn mailing list