Re: Conversion to output ranges
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
Conversion to output ranges
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
Re: Conversion to output ranges
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){ 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); }
Re: Conversion to output ranges
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); }
Re: Conversion to output ranges
On 02/07/2012 04:50 PM, Timon Gehr wrote: 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)'. Just noticed that this overload is not even necessary. 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); }
Re: Conversion to output ranges
Maybe std.outbuffer... auto buffer = new OutBuffer(); int a = 42; buffer.write(a); byte[] bytes = cast(byte[]) buffer.toBytes(); ubyte[] ubytes = buffer.toBytes(); Pedro Lacerda 2012/2/7 Mafi m...@example.org 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