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