annotate dstep/objc/bridge/Bridge.d @ 25:b9de51448c6b

Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
author Jacob Carlborg <doob@me.com>
date Tue, 06 Apr 2010 11:37:27 +0200
parents 6255d355d752
children 57371c29ef73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2 * Copyright: Copyright (c) 2009 Jacob Carlborg.
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 * Version: Initial created: Feb 4, 2009
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module dstep.objc.bridge.Bridge;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 version (Tango)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
10 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
11 import tango.core.Memory;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
12 import tango.core.Traits : ParameterTupleOf, ReturnTypeOf;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
13 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
14
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
15 else
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
17 import GC = std.gc : addRoot;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18 import std.traits : ParameterTypeTuple, ReturnType;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 alias ReturnType ReturnTypeOf;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21 alias ParameterTypeTuple ParameterTupleOf;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 import dstep.internal.String;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 import dstep.internal.Version;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
26 import dstep.objc.bridge.Capsule;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 import dstep.objc.bridge.ClassInitializer;
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
28 import dstep.objc.bridge.Type;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 import dstep.objc.bridge.TypeEncoding;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 import dstep.objc.bridge.Wrapper;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31 import dstep.objc.message;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 import dstep.objc.objc;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 import dstep.objc.runtime;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35 /**
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
36 * Builds a string representing a selector out of the given method
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 *
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
38 * It will build the string using the parameter names as a part of the selector,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
39 * like this:
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
40 *
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
41 * Examples:
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 * ---
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
43 * foo (int x, int y);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
44 * bar ();
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
45 * fooBar (int x);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
46 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
47 * static assert(selectorAsString!(foo) == "foo:y:");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
48 * static assert(selectorAsString!(bar) == "bar");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
49 * static assert(selectorAsString!(fooBar) == "fooBar:");
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 * ---
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51 *
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 * Params:
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
53 * method = the method alias to build the selector of
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
54 *
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
55 * Returns: a string representing the selector
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
56 */
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
57 template selectorAsString (alias method)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
59 const selectorAsString = buildSelector!(method);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
62 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
63 * Registers a method with the Objective-C runtime system,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
64 * maps the method name to a selector, and returns the selector value.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
65 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
66 * You must register a method name with the Objective-C runtime system to obtain
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
67 * the method’s selector before you can add the method to a class definition.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
68 * If the method name has already been registered, this function simply returns
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
69 * the selector.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
70 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
71 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
72 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
73 * SEL sel = selector!("foo:");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
74 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
75 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
76 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
77 * str = the string to register
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
78 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
79 * Returns: a pointer of type SEL specifying the selector for the named method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
80 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
81 SEL selector (string str) ()
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
82 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
83 return sel.registerName!(str);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
84 }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
85
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
86 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
87 * Registers a method with the Objective-C runtime system,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
88 * maps the method name to a selector, and returns the selector value.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
89 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
90 * Using selectorAsString to get the string representation of the selector.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
91 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
92 * You must register a method name with the Objective-C runtime system to obtain
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
93 * the method’s selector before you can add the method to a class definition.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
94 * If the method name has already been registered, this function simply returns
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
95 * the selector.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
96 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
97 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
98 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
99 * foo (int x);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
100 * SEL sel = selector!(foo);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
101 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
102 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
103 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
104 * method = the method to register
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
105 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
106 * Returns: a pointer of type SEL specifying the selector for the named method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
107 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
108 SEL selector (alias method) ()
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
109 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
110 return sel.registerName!(selectorAsString!(method));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
111 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
112
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
113 /**
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
114 * All Objective-C wrappers should mix in this template.
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
115 *
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
116 * Mixes in: $(D_PSYMBOL dstep.objc.bridge.ClassInitializer.ObjcSubclassInitializer)
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
117 *
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
118 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
119 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
120 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
121 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
122 * {
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
123 * mixin ObjcWrap;
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
124 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
125 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
126 */
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
127 template ObjcWrap ()
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
128 {
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
129 /// This variable represents the Objective-C class.
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
130 static private dstep.objc.objc.Class __objcClass;
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
131
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
132 /// This variable represents the Objective-C super class.
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
133 static private dstep.objc.objc.Class __objcSuperClass;
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
134
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
135 /**
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
136 * Allocates a new instance of the receiver.
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
137 *
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
138 * Returns: a new instance of the receiver
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
139 */
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
140 static typeof(this) alloc ()
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
141 {
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
142 return invokeObjcSelfClass!(typeof(this), "alloc");
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
143 }
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
144
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
145 mixin dstep.objc.bridge.ClassInitializer.ObjcSubclassInitializer!(this.stringof, super.stringof);
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
146 }
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
148 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
149 * All Objective-C wrappers should mix in this string.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
150 *
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
151 * Mixes in: $(D_PSYMBOL dstep.objc.bridge.ClassInitializer.ObjcSubclassInitializer)
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
152 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
153 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
154 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
155 * class NSString : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
156 * {
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
157 * mixin ObjcClusterWrap;
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
158 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
159 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
160 */
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
161 template ObjcClusterWrap ()
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
162 {
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
163 /// This variable represents the Objective-C class.
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
164 static private dstep.objc.objc.Class __objcClass;
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
165
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
166 /// This variable represents the Objective-C super class.
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
167 static private dstep.objc.objc.Class __objcSuperClass;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
169 /**
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
170 * Allocates a new instance of the receiver.
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
171 *
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
172 * Returns: a new instance of the receiver
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
173 */
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
174 static typeof(this) alloc ()
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175 {
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
176 return invokeObjcSuperClass!(typeof(this), "alloc");
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
177 }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
178
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
179 mixin dstep.objc.bridge.ClassInitializer.ObjcSubclassInitializer!(this.stringof, super.stringof);
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
180 }
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
182 /**
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
183 * Makes the given field available as an IBOutlet.
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
184 *
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
185 * Mixes in a method that is called by the Objective-C side to set the value of the
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
186 * given field.
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
187 *
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
188 * Mixes in: $(D_PSYMBOL ObjcBindMethod)
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
189 *
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
190 * Examples:
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
191 * ---
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
192 * class AppController : NSObject
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
193 * {
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
194 * NSButton button;
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
195 * mixin IBOutlet!(button);
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
196 * }
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
197 * ---
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
198 *
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
199 * Params:
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
200 * field = the field make available as an IBOutlet
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
201 */
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
202 template IBOutlet (alias field)
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
203 {
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
204 static assert (is(typeof(field) : Object), dstep.objc.bridge.Bridge.buildIBOutletErrorMessage!(field));
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
205
20
6255d355d752 Made it compile with dmd 1.056
Jacob Carlborg <doob@me.com>
parents: 19
diff changeset
206 /// Sets the field
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
207 void __setMethod (typeof(field) value)
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
208 {
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
209 field = value;
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
210 }
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
211
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
212 mixin dstep.objc.bridge.Bridge.ObjcBindMethod!(__setMethod, "set" ~ dstep.objc.bridge.Bridge.toUpper(field.stringof[0]) ~ field.stringof[1 .. $] ~ ":");
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
213 }
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
214
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
215 char toUpper (char c)
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
216 {
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
217 if (c >= 'a' && c <= 'z')
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
218 return c - 32;
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
219
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
220 return c;
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
221 }
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
222
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
223 template buildIBOutletErrorMessage (alias field)
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
224 {
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
225 const buildIBOutletErrorMessage = `The type "` ~ typeof(field).stringof ~ `" of the given field "` ~ field.stringof ~ `" in the class "` ~ typeof(this).stringof ~ `" is not a valid IBOutlet type. IBOutlets can only be of the type Object (or any of its subclasses)`;
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
226 }
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
227
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
228 /**
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
229 * Binds a selector to an instance method.
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
230 *
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
231 * This will create a receiver function which will forward the call to $(D_PARAM method),
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
232 * decapsulating arguments and encapsulating the return value as appropriate.
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
233 * This $(D_KEYWORD template) will use the buildSelector $(D_KEYWORD template) to build
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
234 * the selector. It will automatically infer the return type and the argument types
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
235 * of the method. An action method can only have one parameter and of the type Object
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
236 * (or any of its subclasses).
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
237 *
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
238 * Mixes in: ObjcBindMethod
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
239 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
240 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
241 * ---
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
242 * class AppController : NSObject
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
243 * {
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
244 * void foo (Object sender) {}
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
245 * mixin IBAction!(foo);
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
246 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
247 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
248 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
249 * Params:
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
250 * method = the method to bind
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
251 */
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
252 template IBAction (alias method)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253 {
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
254 static assert (dstep.objc.bridge.Bridge.ParameterTupleOf!(method).length == 1, "An action method is only allowed to have one parameter");
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
255 static assert (is(dstep.objc.bridge.Bridge.ParameterTupleOf!(method)[0] : Object), "An action method can only have a parameter of the type Object (or any of its subclasses)");
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
256
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
257 mixin ObjcBindMethod!(method, dstep.objc.bridge.TypeEncoding.buildSelector!(method));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
259
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
260 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
261 * Binds a selector to an instance method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
262 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
263 * This will create a receiver function which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
264 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
265 * This $(D_KEYWORD template) will use the buildSelector $(D_KEYWORD template) to build
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
266 * the selector. It will automatically infer the return type and the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
267 * of the method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
268 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
269 * Mixes in: ObjcBindMethod
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
270 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
271 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
272 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
273 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
274 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
275 * void foo () {}
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
276 * mixin ObjcBindMethod!(foo);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
277 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
278 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
279 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
280 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
281 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
282 */
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
283 template ObjcBindMethod (alias method)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
284 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
285 mixin ObjcBindMethod!(method, dstep.objc.bridge.TypeEncoding.buildSelector!(method));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
286 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
287
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
288 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
289 * Binds a selector to an instance method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
290 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
291 * This will create a receiver function which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
292 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
293 * It will automatically infer the return type and the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
294 * of the method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
295 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
296 * Mixes in: ObjcBindMethod
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
297 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
298 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
299 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
300 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
301 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
302 * void foo () {}
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
303 * mixin ObjcBindMethod!(foo, "foo");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
304 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
305 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
306 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
307 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
308 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
309 * selector = the selector to bind the method to
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
310 */
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 template ObjcBindMethod (alias method, string selector)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312 {
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
313 mixin ObjcBindMethod!(method, dstep.objc.bridge.Bridge.ReturnTypeOf!(method), selector, dstep.objc.bridge.Bridge.ParameterTupleOf!(method));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
316 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
317 * Binds a selector to an instance method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
318 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
319 * This will create a receiver method which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
320 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
321 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
322 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
323 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
324 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
325 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
326 * int foo (int x)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
327 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
328 * return x;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
329 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
330 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
331 * mixin ObjcBindMethod!(foo, int, "foo:", int);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
332 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
333 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
334 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
335 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
336 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
337 * R = the return type of the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
338 * selector = the selector to bind the method to
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
339 * ARGS = the argument types of the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
340 */
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 template ObjcBindMethod (alias method, R, string selector, ARGS...)
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
342 {
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
343 private
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
344 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
345 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
346 * Resolves the virtual call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
347 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
348 * Returns: a $(D_KEYWORD delegate) to the binded method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
349 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
350 R delegate (ARGS) __resolveVirtualCall ()
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
351 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
352 return &method;
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
353 }
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
354
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
355 /// A type tuple with all the encapsulated types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
356 alias dstep.objc.bridge.Type.ObjcTypes!(ARGS) __ObjcArgs;
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
357
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
358 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
359 * The receiver method, this will be the method called from the Objective-C side
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
360 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
361 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
362 * self = the Objective-C instance to call the method on
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
363 * cmd = the Objective-C selector representing the method to call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
364 * objcArgs = the encapsulated arguments to the binded method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
365 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
366 * Returns: whatever the binded method returns, encapsulated
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
367 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
368 extern (C) static dstep.objc.bridge.Type.ObjcType!(R) __forwardVirtualCall (dstep.objc.objc.id self, dstep.objc.objc.SEL cmd, __ObjcArgs objcArgs)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369 in
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
371 assert(dstep.objc.bridge.Capsule.isCapsule(self));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
373 body
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
374 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
375 R delegate (ARGS) delegate () dg;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
376 dg.ptr = cast(void*) dstep.objc.bridge.Capsule.decapsule!(typeof(this))(self);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
377 dg.funcptr = &__resolveVirtualCall;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378 ARGS args;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380 foreach (i, a ; objcArgs)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
381 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
382 alias typeof(args[i]) ArgType;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
383 args[i] = dstep.objc.bridge.Capsule.decapsule!(ArgType)(a);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
386 static if (is(R == void))
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
387 dg()(args);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
389 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
390 return dstep.objc.bridge.Capsule.encapsule!(R)(dg()(args));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
391 }
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
392
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
393 /// The Objective-C method declaration for the binded method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
394 ObjcMethodDeclaration!(__forwardVirtualCall, R, selector, ARGS) __objcMethodDeclaration;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
398 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
399 * Binds a selector to a class (static) method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
400 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
401 * This will create a receiver function which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
402 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
403 * This $(D_KEYWORD template) will use the buildSelector $(D_KEYWORD template)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
404 * to build the selector. It will automatically infer the return type and the
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
405 * argument types of the method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
406 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
407 * Mixes in: $(D_PSYMBOL ObjcBindClassMethod)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
408 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
409 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
410 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
411 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
412 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
413 * static void foo () {}
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
414 * mixin ObjcBindClassMethod!(foo);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
415 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
416 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
417 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
418 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
419 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
420 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
421 template ObjcBindClassMethod (alias method)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
422 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
423 mixin ObjcBindClassMethod!(method, dstep.objc.bridge.TypeEncoding.buildSelector!(method));
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
424 }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
425
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
426 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
427 * Binds a selector to a class (static) method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
428 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
429 * This will create a receiver function which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
430 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
431 * It will automatically infer the return type and the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
432 * of the method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
433 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
434 * Mixes in: $(D_PSYMBOL ObjcBindClassMethod)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
435 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
436 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
437 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
438 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
439 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
440 * static void foo () {}
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
441 * mixin ObjcBindClassMethod!(foo, "foo");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
442 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
443 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
444 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
445 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
446 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
447 * selector = the selector to bind the method to
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
448 */
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
449 template ObjcBindClassMethod (alias method, string selector)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
450 {
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
451 mixin ObjcBindClassMethod!(method, dstep.objc.bridge.Bridge.ReturnTypeOf!(method), selector, dstep.objc.bridge.Bridge.ParameterTupleOf!(method));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
452 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
453
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
454 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
455 * Binds a selector to a class (static) method.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
456 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
457 * This will create a receiver method which will forward the call to $(D_PARAM method),
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
458 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
459 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
460 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
461 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
462 * class AppController : NSObject
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
463 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
464 * static int foo (int x)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
465 * {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
466 * return x;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
467 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
468 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
469 * mixin ObjcBindClassMethod!(foo, int, "foo:", int);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
470 * }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
471 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
472 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
473 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
474 * method = the method to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
475 * R = the return type of the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
476 * selector = the selector to bind the method to
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
477 * ARGS = the argument types of the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
478 */
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
479 template ObjcBindClassMethod (alias method, R, string selector, ARGS...)
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
480 {
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
481 private
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
482 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
483 /// A type tuple with all the encapsulated types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
484 alias dstep.objc.bridge.Type.ObjcTypes!(ARGS) __ObjcArgs;
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
485
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
486 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
487 * The receiver method, this will be the method called from the Objective-C side
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
488 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
489 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
490 * objcArgs = the encapsulated arguments to the binded method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
491 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
492 * Returns: whatever the binded method returns, encapsulated
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
493 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
494 extern (C) static dstep.objc.bridge.Type.ObjcType!(R) __forwardStaticCall (dstep.objc.objc.Class self, dstep.objc.objc.SEL cmd, __ObjcArgs objcArgs)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
495 in
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
496 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
497 assert(dstep.objc.bridge.Capsule.isCapsule(self));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
498 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499 body
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
501 R function (ARGS) funcPtr = &method;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
502 ARGS args;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
503
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
504 foreach (i, a ; objcArgs)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
505 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
506 alias typeof(args[i]) ArgType;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
507 args[i] = dstep.objc.bridge.Capsule.decapsule!(ArgType)(a);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
508 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
510 static if (is(R == void))
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
511 funcPtr()(args);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
513 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
514 return dstep.objc.bridge.Capsule.encapsule!(R)(funcPtr()(args));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 }
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
516
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
517 /// The Objective-C method declaration for the binded method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
518 ObjcMethodDeclaration!(__forwardStaticCall, R, selector, ARGS) __objcClassMethodDeclaration;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
519 }
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
520 }
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
521
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
522 /**
18
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
523 * This $(D_KEYWORD struct) represents an Objective-C method declaration.
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
524 *
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
525 * Examples:
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
526 * ---
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
527 * class C : NSObject
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
528 * {
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
529 * void foo (int x) {}
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
530 * ObjcMethodDeclaration!(foo, void, "foo", int) objcMethodDecl;
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
531 * }
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
532 * ---
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
533 *
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
534 * Params:
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
535 * imp = the D method
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
536 * R = the return type of the method
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
537 * name = the name of the method
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
538 * ARGS = the argument types of the method
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
539 */
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
540 struct ObjcMethodDeclaration (alias imp, R, string name, ARGS...)
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
541 {
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
542 dstep.objc.objc.IMP methodImp = cast(dstep.objc.objc.IMP) &imp;
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
543 alias R returnType;
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
544 const string methodName = name;
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
545 alias ARGS argsType;
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
546 }
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
547
b2693af5a569 Added IBAction
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
548 /**
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
549 * Binds a D free function to an Objective-C free function.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
550 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
551 * This will create a receiver function which will forward the call to the
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
552 * binded function, decapsulating arguments and encapsulating the return value
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
553 * as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
554 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
555 * Mixes in: $(D_PSYMBOL ObjcBindFunction)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
556 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
557 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
558 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
559 * void foo ();
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
560 * mixin ObjcBindFunction!(foo);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
561 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
562 */
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
563 template ObjcBindFunction (alias func)
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
564 {
19
ae08a08f44d3 Added IBOutlet
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
565 mixin ObjcBindFunction!(func, dstep.objc.bridge.Bridge.ReturnTypeOf!(func), dstep.objc.bridge.Bridge.ParameterTupleOf!(func));
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
566 }
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
567
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
568 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
569 * Binds a D free function to an Objective-C free function.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
570 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
571 * This will create a receiver function which will forward the call to the
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
572 * binded function, decapsulating arguments and encapsulating the return value
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
573 * as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
574 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
575 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
576 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
577 * char foo (int);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
578 * mixin ObjcBindFunction!(foo, char, int);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
579 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
580 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
581 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
582 * func = the function to bind
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
583 * R = the return type of the function
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
584 * ARGS = the argument types of the function
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
585 */
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
586 template ObjcBindFunction (alias func, R, ARGS...)
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
587 {
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
588 private
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
589 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
590 /// A type tuple with all the encapsulated types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
591 alias dstep.objc.bridge.Type.ObjcTypes!(ARGS) __ObjcArgs;
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
592
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
593 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
594 * The receiver function, this will be the function called from the Objective-C side
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
595 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
596 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
597 * objcArgs = the encapsulated arguments to the binded function
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
598 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
599 * Returns: whatever the binded function returns, encapsulated
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
600 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
601 extern (C) dstep.internal.Types.ObjcType!(R) __forwardFunctionCall (__ObjcArgs objcArgs)
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
602 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
603 R function (ARGS) funcPtr = &func;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
604 ARGS args;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
605
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
606 foreach (i, a ; objcArgs)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
607 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
608 alias typeof(args[i]) ArgType;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
609 args[i] = dstep.objc.bridge.Capsule.decapsule!(ArgType)(a);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
610 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
611
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
612 static if (is(R == void))
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
613 funcPtr()(args);
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
614
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
615 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
616 return dstep.objc.bridge.Capsule.encapsule!(R)(funcPtr()(args));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
618 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
619 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
621 /// This $(D_KEYWORD class) acts like a name space for various methods and functions
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
622 class Bridge
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
624 private static Bridge bridgeInstance;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
625
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
626 /// The name of the method declaration variable mixed in in a $(D_KEYWORD class)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
627 const objcMethodDeclarationVar = "__objcMethodDeclaration";
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
628
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
629 /// The name of the class method declaration variable mixed in in a $(D_KEYWORD class)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
630 const objcClassMethodDeclarationVar = "__objcClassMethodDeclaration";
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
631
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
632 /// The name of the variable used on the Objective-C side to store the D object
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
633 const dObjectVar = "dObject";
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
634
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
635 /// This alias is used as an internal representation of a D object
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
636 //alias Object DObjectType;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
637 alias void* DObjectType;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
638
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
639 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
640 * Gets the only instance of this class
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
641 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
642 * Returns: the instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
643 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
644 static Bridge instance ()
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
645 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
646 if (bridgeInstance)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
647 return bridgeInstance;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
648
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
649 return bridgeInstance = new Bridge;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
650 }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
651
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
652 static:
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
653
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
654 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
655 * Gets the value of an Objective-C instance variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
656 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
657 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
658 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
659 * id self;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
660 * int x = getObjcIvar!(int, "x")(self);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
661 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
662 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
663 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
664 * T = the type of the instance variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
665 * name = the name of the instance variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
666 * self = the Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
667 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
668 * Returns: the value of the Objective-C variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
669 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
670 T getObjcIvar (T, string name) (id self)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
671 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
672 T value;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
673
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
674 self.getInstanceVariable!(T, name)(value);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
675
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
676 return value;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
677 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
678
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
679 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
680 * Sets the value of an Objective-C instance variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
681 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
682 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
683 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
684 * id self;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
685 * Bridge.setObjcIvar!(int, "x")(self, 3);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
686 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
687 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
688 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
689 * T = the type of the instance variable
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
690 * name = the name of the instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
691 * objcObject = the Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
692 * value = the value to set
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
693 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
694 void setObjcIvar (T, string name) (id self, T value)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
695 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
696 GC.addRoot(value);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
697 self.setInstanceVariable!(T, dObjectVar)(value);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
698 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
699
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
700 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
701 * Gets the D object stored in the given Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
702 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
703 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
704 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
705 * NSObject object = new NSObject;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
706 * id self = object.objcObject;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
707 * assert(object == Bridge.getDObject(self));
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
708 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
709 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
710 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
711 * self = the Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
712 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
713 * Returns: the D object or null
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
714 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
715 package DObjectType getDObject (id self)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
716 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
717 return getObjcIvar!(DObjectType, dObjectVar)(self);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
718 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
719
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
720 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
721 * Stores the given D object in the given Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
722 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
723 * Examples:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
724 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
725 * NSObject object = new NSObject;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
726 * id self = object.objcObject;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
727 * Bridge.setDObject(object, self);
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
728 * ---
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
729 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
730 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
731 * dObject = the D object to store
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
732 * objcObject = the Objective-C instance to store the D object in
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
733 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
734 * Returns: the Objective-C instance
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
735 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
736 package id setDObject (Object dObject, id objcObject)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
737 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
738 auto o = cast(DObjectType) dObject;
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
739 setObjcIvar!(DObjectType, dObjectVar)(objcObject, o);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
740
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
741 return objcObject;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
742 }
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
743
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
744 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
745 * Deregisters the given Objective-C instance from the bridge
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
746 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
747 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
748 * objcInstance = the Objective-C instance to deregister
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
749 */
25
b9de51448c6b Added an id constructor. Changed the string mixin to a template mixin. Added support for building as a dynamic library
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
750 package void deregisterObjcInstance (id objcInstance)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
751 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
752 GC.removeRoot(getObjcIvar!(DObjectType, dObjectVar)(objcInstance));
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
753 }
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
754
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
755 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
756 * This method wraps the family of $(D_PSYMBOL objc_msgSend) methods which is used to send a message
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
757 * to an instance of a class.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
758 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
759 * This method chooses the appropriate $(D_PSYMBOL objc_msgSend) method depending on the return value,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
760 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
761 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
762 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
763 * R = the return type
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
764 * selector = the selector to call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
765 * ARGS = the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
766 * self = the reciver of the call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
767 * args = the arguments to the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
768 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
769 * Returns: whatever the method returns, encapsulaed
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
770 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
771 R invokeObjcMethod (R, string selector, ARGS...) (id self, ARGS args)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
772 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
773 static assert (checkSelector!(selector, ARGS), "The selector \"" ~ selector ~ "\" and the arguments " ~ ARGS.stringof ~ " do not match");
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
774
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
775 SEL sel = sel.registerName!(selector);
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
776 ObjcTypes!(ARGS) objcArgs;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
777
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
778 foreach (i, a ; args)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
779 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
780 alias typeof(a) ArgType;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
781
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
782 objcArgs[i] = encapsule!(ArgType)(a);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
783 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
784
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
785 static if (is(R == struct))
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
786 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
787 R result;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
788 self.msgSend_stret(result, sel, objcArgs);
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
789
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
790 return result;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
791 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
792
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
793 else static if (is(R == float) || is(R == double) || is(R == real))
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
794 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
795 version (X86)
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
796 return self.msgSend_fpret!(R, ObjcTypes!(ARGS))(sel, objcArgs);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
797
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
798 else version (X86_64)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
799 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
800 static if (is(R == real))
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
801 return self.msgSend_fpret!(R)(sel, objcArgs);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
802
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
803 else
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
804 return self.msgSend!(R)(sel, objcArgs);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
805 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
806
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
807 else
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
808 return self.msgSend!(R)(sel, objcArgs);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
809 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
810
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
811 else static if (needsEncapsulation!(R))
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
812 return decapsule!(R)(self.msgSend(sel, objcArgs));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
813
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
814 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
815 return self.msgSend!(R, ObjcTypes!(ARGS))(sel, objcArgs);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
816 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
817
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
818 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
819 * This method wraps the family of $(D_PSYMBOL objc_msgSend) methods which is used to send a message
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
820 * to a class.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
821 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
822 * This method chooses the appropriate $(D_PSYMBOL objc_msgSend) method depending on the return value,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
823 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
824 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
825 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
826 * R = the return type
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
827 * selector = the selector to call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
828 * ARGS = the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
829 * cls = the reciver of the call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
830 * args = the arguments to the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
831 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
832 * Returns: whatever the method returns, encapsulaed
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
833 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
834 R invokeObjcClassMethod (R, string selector, ARGS...) (Class cls, ARGS args)
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
835 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
836 return invokeObjcMethod!(R, selector, ARGS)(cast(id) cls, args);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
837 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
838
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
839 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
840 * This method wraps the family of $(D_PSYMBOL objc_msgSendSuper) methods which is used to send a message
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
841 * to an instance of a superclass.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
842 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
843 * This method chooses the appropriate $(D_PSYMBOL objc_msgSendSuper) method depending on the return value,
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
844 * decapsulating arguments and encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
845 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
846 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
847 * R = the return type
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
848 * selector = the selector to call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
849 * ARGS = the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
850 * self = the reciver of the call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
851 * args = the arguments to the method
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
852 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
853 * Returns: whatever the method returns, encapsulaed
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
854 */
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
855 R invokeObjcSuperMethod (R, string selector, ARGS...) (objc_super* self, ARGS args)
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
856 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
857 static assert (checkSelector!(selector, ARGS), "The selector \"" ~ selector ~ "\" and the arguments " ~ ARGS.stringof ~ " do not match");
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
858
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
859 SEL sel = sel.registerName!(selector);
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
860 ObjcTypes!(ARGS) objcArgs;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
861
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
862 foreach (i, a ; args)
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
863 {
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
864 alias typeof(a) ArgType;
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
865
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
866 objcArgs[i] = encapsule!(ArgType)(a);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
867 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
868
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
869 static if (is(R == struct))
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
870 {
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
871 R result;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
872 self.msgSendSuper_stret(result, sel, objcArgs);
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
873
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
874 return result;
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
875 }
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
876
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
877 else static if (needsEncapsulation!(R))
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
878 return decapsule!(R)(self.msgSendSuper(sel, objcArgs));
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
879
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
880 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
881 return self.msgSendSuper!(R, ObjcTypes!(ARGS))(sel, objcArgs);
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
882 }
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
883
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
884 /**
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
885 * This method wraps a call to a regular C free function, decapsulating arguments and
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
886 * encapsulating the return value as appropriate.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
887 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
888 * Params:
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
889 * R = the return type
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
890 * func = the function to call
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
891 * ARGS = the argument types
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
892 * args = the arguments to the function
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
893 *
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
894 * Returns: whatever the method returns, encapsulaed
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
895 */
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
896 R invokeObjcFunction (R, alias func, ARGS...) (ARGS args)
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
897 {
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
898 auto funcPtr = &func; // use a function pointer instead of the alias because the function may not be public.
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
899 ObjcTypes!(ARGS) objcArgs;
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
900
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
901 foreach (i, a ; args)
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
902 {
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
903 alias typeof(a) ArgType;
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
904
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
905 objcArgs[i] = encapsule!(ArgType)(a);
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
906 }
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
907
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
908 static if (is(R == void))
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
909 funcPtr(objcArgs);
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
910
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
911 else
16
19885b43130e Huge update, the bridge actually works now
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
912 return decapsule!(R)(funcPtr(objcArgs));
2
9fd439a28ce3 Adapted the scripts for the new bridge + a lot more
Jacob Carlborg <doob@me.com>
parents: 1
diff changeset
913 }
1
033d260cfc9b First upload of the bridge
Jacob Carlborg <doob@me.com>
parents:
diff changeset
914 }