How would You make abstract HANDLE?

Simon s.d.hammett at gmail.com
Thu Jan 20 10:41:43 PST 2011


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


More information about the Digitalmars-d-learn mailing list