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/[email protected]

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);
}
----

Reply via email to