From D struct to C struct
Namespace
rswhite4 at googlemail.com
Sun Nov 17 14:39:43 PST 2013
On Sunday, 17 November 2013 at 22:25:54 UTC, qznc wrote:
> On Sunday, 17 November 2013 at 22:11:02 UTC, Namespace wrote:
>> Hello.
>> I have some trouble with C interfacing.
>> I have a C struct with an integer member and I want to wrap
>> this into a D template. But if I want to access the C API, I
>> have to convert the C struct with the type informations of the
>> D struct.
>> Example: http://dpaste.dzfl.pl/e3d10755
>>
>> The question is: How can I write the ptr method? It is very
>> probable, that these conversion is often used, so the ptr
>> method should be fast and without many garbage. And If
>> possible, I want to avoid the GC / Heap.
>> My current approach doesn't avoid the GC complete, but it
>> displace the problem: http://dpaste.dzfl.pl/449f663f
>>
>> Any further ideas how to solve that?
>
> You cannot use the stack due to your API requirements, so only
> heap or data segment remains. I assume you cannot use static
> variables, so heap it is. You should look into Andreis proposed
> std.allocator to optimize your memory management.
>
> http://forum.dlang.org/post/l4btsk$5u8$1@digitalmars.com
I use my own allocators until Andreis are official merged into
phobos.
But I hoped to avoid the Heap.
I found one solution which would work without using the heap, but
I'm unsure how good and safe it is:
----
import std.stdio;
struct C {
int id;
}
struct C2 {
C _c = void;
inout(C*) ptr() inout pure nothrow {
return &this._c;
}
}
struct D(T) {
T id = 0;
C2 asC2() const {
return C2(C(cast(int) this.id));
}
/// Lots of more comfortable methods.
}
void stuff(const C* a, C* b) {
writefln("a id = %d", a.id);
writefln("b id = %d", b.id);
}
alias Df = D!float;
void main() {
Df src;
Df dst;
stuff(src.asC2().ptr, dst.asC2().ptr);
}
----
More information about the Digitalmars-d-learn
mailing list