On 04/25/2010 02:50 PM, Robert Clipsham wrote:
On 25/04/10 20:32, Ellery Newcomer wrote:
Hmm. Either I'm not understanding you or I didn't explain something
clearly.
something like this
struct Rec2{
ushort index;
ushort nparams;
ushort options;
ushort[] params; // this has nparams elements
}
Rec2 rec2 = {index:1, nparams:2, options:~0, params:[4,5]};
would translate to something like
x"01 00 02 00 FF FF 04 00 05 00"
only the elements part of params gets written out, the length part
doesn't.
Ah, I didn't know this. In which case you should be able to store
nparams for use later when the array is encountered, then parse as
appropriate?
Yeah. The trick is generalizing it. I have about a bazillion different
record types, and I want my read/write routines to operate only on the
type information provided by tupleof as much as possible, so the
structure of each struct documents what it looks like in a binary form.
Something like the following could work
struct Rec2{
ushort index;
ushort nparams;
ushort options;
NoLength!(Parameter[], "nparams") params;
}
...
foreach(i,m; rec2.tupleof){
static if(isNoLength!(typeof(m))){
auto len = lenField!(rec2, typeof(m));
...
}else{
...
}
}
The other thing is, once I've read something in, I'm probably going to
want to manipulate it. As above, to maintain consistency, whenever I do
rec2.params ~= p;
I'd have to make sure to do
rec2.nparams ++;
I'd like to have the second statement come for free (although I suppose
I should just ignore nparams for anything but reading in and use
params.length instead), but I haven't come up with any way to get
NoLength to see nparams.
I bet this would be easier in D2.