Thread overview
Help with dwt-cocoa types
Jul 08, 2008
Jacob Carlborg
Jul 08, 2008
Frank Benoit
Jul 09, 2008
Jacob Carlborg
July 08, 2008
I'm porting swt-cocoa to D and I've run into some type problems that I'm not sure how to best solve.

There are many types that Java don't support like pointers for example and so they replace them with int. I'm now trying to replace them back to, as closely match to, the original types. I'm thinking like this: when the int represents a struct, enum, typedef or other C type I just keep that C type in D. But when the int represents an objective-c (objc) class there are some problems. All objc classes inherit (or based on) from a C type called "id" that looks like this:

typedef id (*IMP)(id, SEL, ...);

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

If the int represents an objc class that is a value type I replace that with the type "id" in D.

If the int represents pointer to an objc class I replace that with a class in D (because it's a class in Java)

If the int represents a pointer to pointer to a objc class I replace that with the type "id**" in D.

But at some places (http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html#//apple_ref/occ/clm/NSData/data)
when they use type type "id" in objc they use in Java a class called "id" (which contains an int), but at other places they use an int for that in Java. That I don't understand.

So what do you think about all this?
July 08, 2008
Jacob Carlborg schrieb:
> typedef id (*IMP)(id, SEL, ...);

I think this typedef shows the declaration of 'IMP', not of 'id'.

struct objc_class{
  // ...
}
struct objc_selector{
  // ...
}
struct objc_object {
  Class isa;
  // ...
}

alias objc_class * Class;
alias objc_object * id;
alias objc_selector * SEL;
alias extern(C) id function(id, SEL, ...) IMP;
July 09, 2008
Frank Benoit wrote:
> Jacob Carlborg schrieb:
>> typedef id (*IMP)(id, SEL, ...);
> 
> I think this typedef shows the declaration of 'IMP', not of 'id'.
> 
> struct objc_class{
>   // ...
> }
> struct objc_selector{
>   // ...
> }
> struct objc_object {
>   Class isa;
>   // ...
> }
> 
> alias objc_class * Class;
> alias objc_object * id;
> alias objc_selector * SEL;
> alias extern(C) id function(id, SEL, ...) IMP;

That makes sense. And here we can see how bad C styled function pointers are.