1899
|
1 /* -----------------------------------------------------------------------------
|
|
2 * cpointer.i
|
|
3 *
|
|
4 * SWIG library file containing macros that can be used to manipulate simple
|
|
5 * pointer objects.
|
|
6 * ----------------------------------------------------------------------------- */
|
|
7
|
|
8 /* -----------------------------------------------------------------------------
|
|
9 * %pointer_class(type,name)
|
|
10 *
|
|
11 * Places a simple proxy around a simple type like 'int', 'float', or whatever.
|
|
12 * The proxy provides this interface:
|
|
13 *
|
|
14 * class type {
|
|
15 * public:
|
|
16 * type();
|
|
17 * ~type();
|
|
18 * type value();
|
|
19 * void assign(type value);
|
|
20 * };
|
|
21 *
|
|
22 * Example:
|
|
23 *
|
|
24 * %pointer_class(int, intp);
|
|
25 *
|
|
26 * int add(int *x, int *y) { return *x + *y; }
|
|
27 *
|
|
28 * In python (with proxies)
|
|
29 *
|
|
30 * >>> a = intp()
|
|
31 * >>> a.assign(10)
|
|
32 * >>> a.value()
|
|
33 * 10
|
|
34 * >>> b = intp()
|
|
35 * >>> b.assign(20)
|
|
36 * >>> print add(a,b)
|
|
37 * 30
|
|
38 *
|
|
39 * As a general rule, this macro should not be used on class/structures that
|
|
40 * are already defined in the interface.
|
|
41 * ----------------------------------------------------------------------------- */
|
|
42
|
|
43
|
|
44 %define %pointer_class(TYPE, NAME)
|
|
45 %{
|
|
46 typedef TYPE NAME;
|
|
47 %}
|
|
48
|
|
49 typedef struct {
|
|
50 } NAME;
|
|
51
|
|
52 %extend NAME {
|
|
53 #ifdef __cplusplus
|
|
54 NAME() {
|
|
55 return new TYPE();
|
|
56 }
|
|
57 ~NAME() {
|
|
58 if ($self) delete $self;
|
|
59 }
|
|
60 #else
|
|
61 NAME() {
|
|
62 return (TYPE *) calloc(1,sizeof(TYPE));
|
|
63 }
|
|
64 ~NAME() {
|
|
65 if ($self) free($self);
|
|
66 }
|
|
67 #endif
|
|
68 }
|
|
69
|
|
70 %extend NAME {
|
|
71
|
|
72 void assign(TYPE value) {
|
|
73 *$self = value;
|
|
74 }
|
|
75 TYPE value() {
|
|
76 return *$self;
|
|
77 }
|
|
78 TYPE * cast() {
|
|
79 return $self;
|
|
80 }
|
|
81 static NAME * frompointer(TYPE *t) {
|
|
82 return (NAME *) t;
|
|
83 }
|
|
84
|
|
85 }
|
|
86
|
|
87 %types(NAME = TYPE);
|
|
88
|
|
89 %enddef
|
|
90
|
|
91 /* -----------------------------------------------------------------------------
|
|
92 * %pointer_functions(type,name)
|
|
93 *
|
|
94 * Create functions for allocating/deallocating pointers. This can be used
|
|
95 * if you don't want to create a proxy class or if the pointer is complex.
|
|
96 *
|
|
97 * %pointer_functions(int, intp)
|
|
98 *
|
|
99 * int add(int *x, int *y) { return *x + *y; }
|
|
100 *
|
|
101 * In python (with proxies)
|
|
102 *
|
|
103 * >>> a = copy_intp(10)
|
|
104 * >>> intp_value(a)
|
|
105 * 10
|
|
106 * >>> b = new_intp()
|
|
107 * >>> intp_assign(b,20)
|
|
108 * >>> print add(a,b)
|
|
109 * 30
|
|
110 * >>> delete_intp(a)
|
|
111 * >>> delete_intp(b)
|
|
112 *
|
|
113 * ----------------------------------------------------------------------------- */
|
|
114
|
|
115 %define %pointer_functions(TYPE,NAME)
|
|
116 %{
|
|
117 static TYPE *new_##NAME() { %}
|
|
118 #ifdef __cplusplus
|
|
119 %{ return new TYPE(); %}
|
|
120 #else
|
|
121 %{ return (TYPE *) calloc(1,sizeof(TYPE)); %}
|
|
122 #endif
|
|
123 %{}
|
|
124
|
|
125 static TYPE *copy_##NAME(TYPE value) { %}
|
|
126 #ifdef __cplusplus
|
|
127 %{ return new TYPE(value); %}
|
|
128 #else
|
|
129 %{ TYPE *obj = (TYPE *) calloc(1,sizeof(TYPE));
|
|
130 *obj = value;
|
|
131 return obj; %}
|
|
132 #endif
|
|
133 %{}
|
|
134
|
|
135 static void delete_##NAME(TYPE *obj) { %}
|
|
136 #ifdef __cplusplus
|
|
137 %{ if (obj) delete obj; %}
|
|
138 #else
|
|
139 %{ if (obj) free(obj); %}
|
|
140 #endif
|
|
141 %{}
|
|
142
|
|
143 static void NAME ##_assign(TYPE *obj, TYPE value) {
|
|
144 *obj = value;
|
|
145 }
|
|
146
|
|
147 static TYPE NAME ##_value(TYPE *obj) {
|
|
148 return *obj;
|
|
149 }
|
|
150 %}
|
|
151
|
|
152 TYPE *new_##NAME();
|
|
153 TYPE *copy_##NAME(TYPE value);
|
|
154 void delete_##NAME(TYPE *obj);
|
|
155 void NAME##_assign(TYPE *obj, TYPE value);
|
|
156 TYPE NAME##_value(TYPE *obj);
|
|
157
|
|
158 %enddef
|
|
159
|
|
160 /* -----------------------------------------------------------------------------
|
|
161 * %pointer_cast(type1,type2,name)
|
|
162 *
|
|
163 * Generates a pointer casting function.
|
|
164 * ----------------------------------------------------------------------------- */
|
|
165
|
|
166 %define %pointer_cast(TYPE1,TYPE2,NAME)
|
|
167 %inline %{
|
|
168 TYPE2 NAME(TYPE1 x) {
|
|
169 return (TYPE2) x;
|
|
170 }
|
|
171 %}
|
|
172 %enddef
|
|
173
|
|
174
|
|
175
|
|
176
|
|
177
|
|
178
|
|
179
|
|
180
|