digitalmars.D.learn - Conversion to output ranges
- Mafi (9/9) Feb 07 2012 Hi,
- Timon Gehr (27/36) Feb 07 2012 You could use std.format.formattedWrite.
- Timon Gehr (2/41) Feb 07 2012
- Timon Gehr (2/47) Feb 07 2012
- Pedro Lacerda (11/67) Feb 07 2012 Sorry, I didn't reused the buffer. Hope this helps:
- Mafi (6/51) Feb 08 2012 Thanks :) This solution seems to work.
- Pedro Lacerda (8/17) Feb 07 2012 Maybe std.outbuffer...
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
Feb 07 2012
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. MafiYou 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); }
Feb 07 2012
On 02/07/2012 04:49 PM, Timon Gehr wrote:On 02/07/2012 02:35 PM, Mafi wrote:Should be 'void put(T s)'.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. MafiYou 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); }
Feb 07 2012
On 02/07/2012 04:50 PM, Timon Gehr wrote:On 02/07/2012 04:49 PM, Timon Gehr wrote:Just noticed that this overload is not even necessary.On 02/07/2012 02:35 PM, Mafi wrote:Should be 'void put(T s)'.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. MafiYou 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); }
Feb 07 2012
Sorry, I didn't reused the buffer. Hope this helps:
auto buffer = new OutBuffer();
int a = 42;
buffer.write(a);
byte[] bytes = cast(byte[]) buffer.toBytes();
ubyte[] ubytes = buffer.toBytes();
buffer.offset = 0; // cleared
buffer.write(cast(byte[]) [1,2,0x2]);
Timon, std.outbuffer.OutBuffer looks like your Filler struct.
Pedro Lacerda
2012/2/7 Timon Gehr <timon.gehr gmx.ch>
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);
}
Feb 07 2012
Am 07.02.2012 16:50, schrieb Timon Gehr:On 02/07/2012 04:49 PM, Timon Gehr wrote: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. MafiOn 02/07/2012 02:35 PM, Mafi wrote:Should be 'void put(T s)'.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. MafiYou 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); }
Feb 08 2012
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 <mafi 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
Feb 07 2012









Pedro Lacerda <pslacerda gmail.com> 