On 20/01/2011 02:20, Mariusz Gliwiński wrote:
2011-01-19 19:23, Simon wrote:
Traditionally:

struct dummy;

alias dummy* HANDLE;

void doSomething(HANDLE h) {
}

Just don't provide a body for dummy to keep it abstract.
So, if I understood correctly I can't transparently swap pointer with
integer of the same size?

You could use a uintptr_t but you shouldn't.
Using a pointer keeps your interface type safe.

>
Fair enough, but:
#iface.d
struct _handle;
alias _handle* HANDLE;

#a.d
struct _handle {
uintptr_t val;
}
class A : iface {
void doSomething(HANDLE h) {
assert(node.val < _t.length); //HERE
}
}

states:
a.d (HERE): Error: struct _handle is forward referenced

Which means that he doesn't really see _handle defined, even if it's
defined few lines above. Am i doing something wrong?

Thanks,
Mariusz Gliwiński

You'll have to use casts in the implementation of your lib.

so:

#iface.d

struct _handle;
alias _handle* HANDLE;

#a.d

struct actualData {
        uintptr_t val;
}

class A : iface {
  void doSomething(HANDLE h) {
     auto ad = cast(actualData*)h;
  }
}

I don't know of any more elegant way of doing it.

D's module system has some draw backs when it comes to trying to fully encapsulate a library.

--
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk

Reply via email to