1
2 /******************************************************************************
3 * $Id: swig_csharp_extensions.i 806e9ded87d1002791ad78167c19292d0c93c964 2020-08-21 19:21:53 +0200 Björn Harrtell $
4 *
5 * Name: swig_csharp_extensions.i
6 * Purpose: Fix for the SWIG Interface problems (early GC)
7 * and implementing SWIGTYPE *DISOWN
8 * Author: Tamas Szekeres
9 *
10 */
11
12 #if (SWIG_VERSION < 0x020000)
13 // Ensure the class is not marked BeforeFieldInit causing memory corruption with CLR4
14 %pragma(csharp) imclasscode=%{
$imclassname()15 static $imclassname() {
16 }
17 %}
18 #endif
19
20 %typemap(csout, excode=SWIGEXCODE) SWIGTYPE {
21 $&csclassname ret = new $&csclassname($imcall, true, null);$excode
22 return ret;
23 }
24
25 %typemap(csout, excode=SWIGEXCODE, new="1") SWIGTYPE & {
26 $csclassname ret = new $csclassname($imcall, $owner, ThisOwn_$owner());$excode
27 return ret;
28 }
29 %typemap(csout, excode=SWIGEXCODE, new="1") SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) {
30 IntPtr cPtr = $imcall;
31 $csclassname ret = (cPtr == IntPtr.Zero) ? null : new $csclassname(cPtr, $owner, ThisOwn_$owner());$excode
32 return ret;
33 }
34 %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE & %{
35 get {
36 $csclassname ret = new $csclassname($imcall, $owner, ThisOwn_$owner());$excode
37 return ret;
38 } %}
39 %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
40 get {
41 IntPtr cPtr = $imcall;
42 $csclassname ret = (cPtr == IntPtr.Zero) ? null : new $csclassname(cPtr, $owner, ThisOwn_$owner());$excode
43 return ret;
44 } %}
45 %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *& {
46 IntPtr cPtr = $imcall;
47 $*csclassname ret = (cPtr == IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner, ThisOwn_$owner());$excode
48 return ret;
49 }
50 // Proxy classes (base classes, i.e, not derived classes)
51 %typemap(csbody) SWIGTYPE %{
52 private HandleRef swigCPtr;
53 protected bool swigCMemOwn;
54 protected object swigParentRef;
55
ThisOwn_true()56 protected static object ThisOwn_true() { return null; }
ThisOwn_false()57 protected object ThisOwn_false() { return this; }
58
$csclassname(IntPtr cPtr,bool cMemoryOwn,object parent)59 public $csclassname(IntPtr cPtr, bool cMemoryOwn, object parent) {
60 swigCMemOwn = cMemoryOwn;
61 swigParentRef = parent;
62 swigCPtr = new HandleRef(this, cPtr);
63 }
64
getCPtr($csclassname obj)65 public static HandleRef getCPtr($csclassname obj) {
66 return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
67 }
getCPtrAndDisown($csclassname obj,object parent)68 public static HandleRef getCPtrAndDisown($csclassname obj, object parent) {
69 if (obj != null)
70 {
71 obj.swigCMemOwn = false;
72 obj.swigParentRef = parent;
73 return obj.swigCPtr;
74 }
75 else
76 {
77 return new HandleRef(null, IntPtr.Zero);
78 }
79 }
getCPtrAndSetReference($csclassname obj,object parent)80 public static HandleRef getCPtrAndSetReference($csclassname obj, object parent) {
81 if (obj != null)
82 {
83 obj.swigParentRef = parent;
84 return obj.swigCPtr;
85 }
86 else
87 {
88 return new HandleRef(null, IntPtr.Zero);
89 }
90 }
91 %}
92
93
94 #if SWIG_VERSION > 0x020000
95 // Derived proxy classes
96 %typemap(csbody_derived) SWIGTYPE %{
97 private HandleRef swigCPtr;
98
$csclassname(IntPtr cPtr,bool cMemoryOwn,object parent)99 public $csclassname(IntPtr cPtr, bool cMemoryOwn, object parent) : base($modulePINVOKE.$csclassname_SWIGUpcast(cPtr), cMemoryOwn, parent) {
100 swigCPtr = new HandleRef(this, cPtr);
101 }
102
getCPtr($csclassname obj)103 public static HandleRef getCPtr($csclassname obj) {
104 return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
105 }
getCPtrAndDisown($csclassname obj,object parent)106 public static HandleRef getCPtrAndDisown($csclassname obj, object parent) {
107 if (obj != null)
108 {
109 obj.swigCMemOwn = false;
110 obj.swigParentRef = parent;
111 return obj.swigCPtr;
112 }
113 else
114 {
115 return new HandleRef(null, IntPtr.Zero);
116 }
117 }
getCPtrAndSetReference($csclassname obj,object parent)118 public static HandleRef getCPtrAndSetReference($csclassname obj, object parent) {
119 if (obj != null)
120 {
121 obj.swigParentRef = parent;
122 return obj.swigCPtr;
123 }
124 else
125 {
126 return new HandleRef(null, IntPtr.Zero);
127 }
128 }
129 %}
130 #else
131 // Derived proxy classes
132 %typemap(csbody_derived) SWIGTYPE %{
133 private HandleRef swigCPtr;
134
$csclassname(IntPtr cPtr,bool cMemoryOwn,object parent)135 public $csclassname(IntPtr cPtr, bool cMemoryOwn, object parent) : base($modulePINVOKE.$csclassnameUpcast(cPtr), cMemoryOwn, parent) {
136 swigCPtr = new HandleRef(this, cPtr);
137 }
getCPtr($csclassname obj)138 public static HandleRef getCPtr($csclassname obj) {
139 return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
140 }
getCPtrAndDisown($csclassname obj,object parent)141 public static HandleRef getCPtrAndDisown($csclassname obj, object parent) {
142 if (obj != null)
143 {
144 obj.swigCMemOwn = false;
145 obj.swigParentRef = parent;
146 return obj.swigCPtr;
147 }
148 else
149 {
150 return new HandleRef(null, IntPtr.Zero);
151 }
152 }
getCPtrAndSetReference($csclassname obj,object parent)153 public static HandleRef getCPtrAndSetReference($csclassname obj, object parent) {
154 if (obj != null)
155 {
156 obj.swigParentRef = parent;
157 return obj.swigCPtr;
158 }
159 else
160 {
161 return new HandleRef(null, IntPtr.Zero);
162 }
163 }
164 %}
165 #endif
166
167 // Typewrapper classes
168 %typemap(csbody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
169 private HandleRef swigCPtr;
170
$csclassname(IntPtr cPtr,bool futureUse,object parent)171 public $csclassname(IntPtr cPtr, bool futureUse, object parent) {
172 swigCPtr = new HandleRef(this, cPtr);
173 }
174
$csclassname()175 protected $csclassname() {
176 swigCPtr = new HandleRef(null, IntPtr.Zero);
177 }
178
getCPtr($csclassname obj)179 public static HandleRef getCPtr($csclassname obj) {
180 return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
181 }
182 %}
183
184 %typemap(csdispose) SWIGTYPE %{
~$csclassname()185 ~$csclassname() {
186 Dispose();
187 }
188 %}
189
this($imcall,true,null)190 %typemap(csconstruct, excode=SWIGEXCODE) SWIGTYPE %{: this($imcall, true, null) {$excode
191 }
192 %}
193
194 %typemap(csdisposing, methodname="Dispose", methodmodifiers="public") SWIGTYPE {
lock(this)195 lock(this) {
196 if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) {
197 swigCMemOwn = false;
198 $imcall;
199 }
200 swigCPtr = new HandleRef(null, IntPtr.Zero);
201 swigParentRef = null;
202 GC.SuppressFinalize(this);
203 }
204 }
205
206 %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="public") TYPE {
lock(this)207 lock(this) {
208 if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) {
209 swigCMemOwn = false;
210 $imcall;
211 }
212 swigCPtr = new HandleRef(null, IntPtr.Zero);
213 swigParentRef = null;
214 GC.SuppressFinalize(this);
215 base.Dispose();
216 }
217 }
218
219 %typemap(csin) SWIGTYPE *DISOWN "$csclassname.getCPtrAndDisown($csinput, ThisOwn_false())"
220 %typemap(csin) SWIGTYPE *SETREFERENCE "$csclassname.getCPtrAndSetReference($csinput, ThisOwn_false())"
221
222 %pragma(csharp) modulecode=%{
223 internal class $moduleObject : IDisposable {
Dispose()224 public virtual void Dispose() {
225
226 }
227 }
228 internal static $moduleObject the$moduleObject = new $moduleObject();
ThisOwn_true()229 protected static object ThisOwn_true() { return null; }
ThisOwn_false()230 protected static object ThisOwn_false() { return the$moduleObject; }
231 %}
232
233
234 /******************************************************************************
235 * Generic functions to marshal SWIGTYPE arrays *
236 *****************************************************************************/
237
238 %define IMPLEMENT_ARRAY_MARSHALER(CTYPE)
239 %csmethodmodifiers __WriteCArrayItem_##CTYPE "private";
240 %csmethodmodifiers __ReadCArrayItem_##CTYPE "private";
241 %csmethodmodifiers __AllocCArray_##CTYPE "private";
242 %csmethodmodifiers __FreeCArray_##CTYPE "private";
243 %apply (void *buffer_ptr) {CTYPE* carray};
244 %apply (void *buffer_ptr) {CTYPE* __AllocCArray_##CTYPE};
CTYPE(CTYPE * carray,int index,CTYPE * value)245 void __WriteCArrayItem_##CTYPE(CTYPE* carray, int index, CTYPE* value) {
246 carray[index] = *value;
247 }
CTYPE(CTYPE * carray,int index)248 CTYPE* __ReadCArrayItem_##CTYPE(CTYPE* carray, int index) {
249 return &carray[index];
250 }
CTYPE(int size)251 CTYPE* __AllocCArray_##CTYPE(int size) {
252 return (CTYPE*)CPLMalloc(size * sizeof(CTYPE));
253 }
CTYPE(CTYPE * carray)254 void __FreeCArray_##CTYPE(CTYPE* carray) {
255 if (carray)
256 CPLFree(carray);
257 }
258 %clear CTYPE* carray;
259 %clear CTYPE* __AllocCArray_##CTYPE;
260 %enddef
261
262 %define IMPLEMENT_ARRAY_MARSHALER_STATIC(CTYPE)
263 %csmethodmodifiers __WriteCArrayItem_##CTYPE "internal";
264 %csmethodmodifiers __ReadCArrayItem_##CTYPE "internal";
265 %csmethodmodifiers __AllocCArray_##CTYPE "internal";
266 %csmethodmodifiers __FreeCArray_##CTYPE "internal";
267 %apply (void *buffer_ptr) {CTYPE* carray};
268 %apply (void *buffer_ptr) {CTYPE* __AllocCArray_##CTYPE};
269 %inline %{
CTYPE(CTYPE * carray,int index,CTYPE * value)270 void __WriteCArrayItem_##CTYPE(CTYPE* carray, int index, CTYPE* value) {
271 carray[index] = *value;
272 }
273 %}
274 %inline %{
CTYPE(CTYPE * carray,int index)275 CTYPE* __ReadCArrayItem_##CTYPE(CTYPE* carray, int index) {
276 return &carray[index];
277 }
278 %}
279 %inline %{
CTYPE(int size)280 CTYPE* __AllocCArray_##CTYPE(int size) {
281 return (CTYPE*)CPLMalloc(size * sizeof(CTYPE));
282 }
283 %}
284 %inline %{
CTYPE(CTYPE * carray)285 void __FreeCArray_##CTYPE(CTYPE* carray) {
286 if (carray)
287 CPLFree(carray);
288 }
289 %}
290 %clear CTYPE* carray;
291 %clear CTYPE* __AllocCArray_##CTYPE;
292 %enddef
293
294
295 %define DEFINE_EXTERNAL_CLASS(CTYPE, CSTYPE)
296 %typemap(cstype) (CTYPE*) "CSTYPE"
297 %typemap(csin) (CTYPE*) "CSTYPE.getCPtr($csinput)"
298 %typemap(csout, excode=SWIGEXCODE, new="1") CTYPE *, CTYPE [], CTYPE (CLASS::*) {
299 IntPtr cPtr = $imcall;
300 CSTYPE ret = (cPtr == IntPtr.Zero) ? null : new CSTYPE(cPtr, $owner, ThisOwn_$owner());$excode
301 return ret;
302 }
303 %enddef
304