Woops, forgot it in last email, here we go:
/////////////////////////////////////////
proc test [T with Str[T]] (p: &T) {
// Print all the info about the pointer
//Collector::print_pointer_data p;
// Get the shape from the info.
var rtti = p.address.Collector::get_pointer_data.shape;
// get the encoder and print the address (to make sure it isn't NULL)
var encoder = rtti.Rtti::encoder;
//println$ "Encoder = " + (C_hack::cast[address] encoder).str;
// get the decoder and print the address (to make sure it isn't NULL)
var decoder = rtti.Rtti::decoder;
//println$ "Decoder = " + (C_hack::cast[address] decoder).str;
// Encode the data
var encoded_string = encoder p.address;
// Print the encoded data (will contain binary crap).
//println$ "Encoded=" + encoded_string;
// get pointer to the internal array because decoders use
// arrays whereas encoders use strings.
var sarr = encoded_string.cstr;
// Allocate new storage for a copy of the data.
var slen = C_hack::sizeof[T];
var store = C_hack::malloc (slen);
// decode the encoded data into the store.
var endix = decoder (store, sarr, 0uz);
// Check the decoder consumed exactly the string length.
//println$ "End index = " + endix.str + " should = " + encoded_string.len.str;
assert endix == encoded_string.len;
// Now cast the store to the expected type and print it out.
var scopy = C_hack::cast[&T] store;
println$ "Decoded copy = " + str (*scopy);
var s2 = Serialise::encode_varray (p.address);
var p2 = C_hack::cast[&T]$ Serialise::decode_varray (s2);
println$ "Decoded copy2= " + str (*p2);
}
// Our first test case is just a string, we know these are nasty.
var p = new "Hello";
println$ *p;
test p;
println$ "-" * 20;
// Our second test case is a struct, containing
// a pod struct and a string.
// The nested struct.
struct X {
a:int;
b:int;
};
// The test case.
struct Y {
c:X;
d:string;
}
// We need to print it.
instance Str[Y] {
fun str (y: Y) =>
"This is a Y: (c:(" + y.c.a.str + ","+y.c.b.str+"),d:"+y.d+")"
;
}
// A sample value.
var c = new Y ( X(1,2), "hello world");
println$ c*.str;
test c;
println$ "-" * 20;
// Another example:
var d = new (1,2.3,"World",99L);
println$ *d;
test d;
println$ "-" * 20;
// Ok lets try an array
var e = new (1,2,3,4);
println$ *e;
test e;
println$ "-" * 20;
// And a non-pod array
var f = new ("Hello","World","of","Felix");
println$ *f;
test f;
println$ "-" * 20;
// And an array of Y's
var g = new ( Y (X(1,2),"three"), Y(X(4,5),"six"));
println$ *g;
test g;
println$ "-" * 20;
// Tuple containing an nested array
var h = new (1, (*g,*g));
println$ *h;
test h;
println$ "-" * 20;
// Now a varray
var v = varray[string] (5.size);
v+="42";
v+="44";
v+="46";
println$ v;
var vser = Serialise::encode_varray v.stl_begin.address;
var cpy = C_hack::cast[varray[string]]$ Serialise::decode_varray vser;
println$ cpy;
/////////////////////////////////////////
--
john skaller
[email protected]
http://felix-lang.org
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language