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