On 02/17/2013 09:32 PM, Ali Çehreli wrote:
On 02/17/2013 12:12 PM, jerro wrote:

 > You don't need to cast it each time, you can do something like:
 >
 > auto structPointer = cast(MyStruct*) byteArray.ptr;

And that pointer can be converted to a D slice:

MyStruct[] slice = structPointer[0..number_of_struct_objects];

Use 'slice' as a regular D slice from that point on.

Ali


Unfortunately, it's a struct because it isn't an array. It's several arrays, not all of the same type. (one int array, one uint array, one long array, a few counters and flags, and occasionally also a char array [actually a utf-8 string], but since it's coming in from C it doesn't start out as immutable, and it contains an extra terminal \0.) So a slice wouldn't work.

The structPointer would work, but since I really dislike working with pointers, I'll probably convert it into a class with dynamic arrays almost immediately. And on the way out, convert it back into a byte array at the very last moment. This will be a bit less efficient, but as a trade-off, I won't get confused about what I'm doing (or not as much so). (OTOH, do note that the structPointer approach would require that I define lots of different structs, whereas if I convert it into a class, I can get by with one definition, and a more complicated construct/emit pair. So it's probably a reasonable tradeoff...or perhaps even a bit favorable towards the class, even though every reference to a dynamic array involves an extra dereference.)

Reply via email to