1 // Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the
2 // visibility of the constructor and getCPtr method if desired to public if using multiple modules.
3 #ifndef SWIG_SHARED_PTR_TYPEMAPS
4 #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE)
5 #endif
6 
7 %include <shared_ptr.i>
8 
9 // Language specific macro implementing all the customisations for handling the smart pointer
10 %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...)
11 
12 // %naturalvar is as documented for member variables
13 %naturalvar TYPE;
14 %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >;
15 
16 // destructor wrapper customisation
17 %feature("unref") TYPE
18 //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter<SWIG_null_deleter>(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n"
19                                "(void)arg1; delete smartarg1;"
20 
21 // Typemap customisations...
22 
23 // plain value
24 %typemap(in) CONST TYPE ($&1_type argp = 0) %{
25   argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0;
26   if (!argp) {
27     SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type");
28     return $null;
29   }
30   $1 = *argp; %}
31 %typemap(out) CONST TYPE
32 %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %}
33 
34 %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") CONST TYPE
35 %{ $input = 0;
36   *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %}
37 
38 %typemap(directorout) CONST TYPE
39 %{ if (!$input) {
40     SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type");
41     return $null;
42   }
43   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input;
44   $result = *smartarg->get();
45   %}
46 
47 // plain pointer
48 %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{
49   smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input;
50   $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %}
51 %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{
52   *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0;
53 %}
54 
55 %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE *
56 %{ $input = 0;
57   if ($1) {
58     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0);
59   } %}
60 
61 %typemap(directorout) CONST TYPE * %{
62 #error "typemaps for $1_type not available"
63 %}
64 
65 // plain reference
66 %typemap(in) CONST TYPE & %{
67   $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0);
68   if (!$1) {
69     SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null");
70     return $null;
71   } %}
72 %typemap(out, fragment="SWIG_null_deleter") CONST TYPE &
73 %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %}
74 
75 %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE &
76 %{ $input = 0;
77   *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %}
78 
79 %typemap(directorout) CONST TYPE & %{
80 #error "typemaps for $1_type not available"
81 %}
82 
83 // plain pointer by reference
84 %typemap(in) TYPE *CONST& ($*1_ltype temp = 0)
85 %{ temp = (TYPE *)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0);
86    $1 = &temp; %}
87 %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST&
88 %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %}
89 
90 %typemap(directorin,descriptor="L$packagepath/$*javaclassname;") TYPE *CONST&
91 %{ $input = 0;
92   if ($1) {
93     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0);
94  } %}
95 
96 %typemap(directorout) TYPE *CONST& %{
97 #error "typemaps for $1_type not available"
98 %}
99 
100 // shared_ptr by value
101 %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($&1_type argp)
102 %{ argp = *($&1_ltype*)&$input;
103    if (argp) $1 = *argp; %}
104 %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
105 %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %}
106 
107 %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
108 %{ $input = 0;
109   if ($1) {
110     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1);
111   } %}
112 
113 %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >
114 %{ if ($input) {
115     $&1_type smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input;
116     $result = *smartarg;
117   } %}
118 
119 // shared_ptr by reference
120 %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull)
121 %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %}
122 %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &
123 %{ *($&1_ltype)&$result = *$1 ? new $*1_ltype(*$1) : 0; %}
124 
125 %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &
126 %{ $input = 0;
127   if ($1) {
128     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1);
129   } %}
130 
131 %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{
132 #error "typemaps for $1_type not available"
133 %}
134 
135 // shared_ptr by pointer
136 %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull)
137 %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %}
138 %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *
139 %{ *($&1_ltype)&$result = ($1 && *$1) ? new $*1_ltype(*$1) : 0;
140    if ($owner) delete $1; %}
141 
142 %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *
143 %{ $input = 0;
144   if ($1 && *$1) {
145     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1);
146   } %}
147 
148 %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{
149 #error "typemaps for $1_type not available"
150 %}
151 
152 // shared_ptr by pointer reference
153 %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0)
154 %{ temp = $input ? *($1_ltype)&$input : &tempnull;
155    $1 = &temp; %}
156 %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *&
157 %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %}
158 
159 %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *&
160 %{ $input = 0;
161   if ($1 && *$1) {
162     *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1);
163   } %}
164 
165 %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{
166 #error "typemaps for $1_type not available"
167 %}
168 
169 // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug
170 %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{
171 #error "typemaps for $1_type not available"
172 %}
173 %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{
174 #error "typemaps for $1_type not available"
175 %}
176 
177 
178 %typemap (jni)    SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
179                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
180                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
181                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "jlong"
182 %typemap (jtype)  SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
183                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
184                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
185                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "long"
186 %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
187                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
188                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
189                   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)"
190 
191 %typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
192                  SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
193                  SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
194                  SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)"
195 
196 %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > {
197     long cPtr = $jnicall;
198     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
199   }
200 %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & {
201     long cPtr = $jnicall;
202     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
203   }
204 %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * {
205     long cPtr = $jnicall;
206     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
207   }
208 %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& {
209     long cPtr = $jnicall;
210     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
211   }
212 
213 
214 %typemap(javaout) CONST TYPE {
215     return new $typemap(jstype, TYPE)($jnicall, true);
216   }
217 %typemap(javaout) CONST TYPE & {
218     return new $typemap(jstype, TYPE)($jnicall, true);
219   }
220 %typemap(javaout) CONST TYPE * {
221     long cPtr = $jnicall;
222     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
223   }
224 %typemap(javaout) TYPE *CONST& {
225     long cPtr = $jnicall;
226     return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true);
227   }
228 
229 %typemap(javadirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javacall)"
230 
231 %typemap(javadirectorin) CONST TYPE,
232                          CONST TYPE *,
233                          CONST TYPE &,
234                          TYPE *CONST& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)"
235 
236 %typemap(javadirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
237                          SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
238                          SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
239                          SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)"
240 
241 // Base proxy classes
242 %typemap(javabody) TYPE %{
243   private transient long swigCPtr;
244   private transient boolean swigCMemOwn;
245 
$javaclassname(long cPtr,boolean cMemoryOwn)246   PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) {
247     swigCMemOwn = cMemoryOwn;
248     swigCPtr = cPtr;
249   }
250 
getCPtr($javaclassname obj)251   CPTR_VISIBILITY static long getCPtr($javaclassname obj) {
252     return (obj == null) ? 0 : obj.swigCPtr;
253   }
254 
swigSetCMemOwn(boolean own)255   CPTR_VISIBILITY void swigSetCMemOwn(boolean own) {
256     swigCMemOwn = own;
257   }
258 %}
259 
260 // Derived proxy classes
261 %typemap(javabody_derived) TYPE %{
262   private transient long swigCPtr;
263   private transient boolean swigCMemOwnDerived;
264 
$javaclassname(long cPtr,boolean cMemoryOwn)265   PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) {
266     super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true);
267     swigCMemOwnDerived = cMemoryOwn;
268     swigCPtr = cPtr;
269   }
270 
getCPtr($javaclassname obj)271   CPTR_VISIBILITY static long getCPtr($javaclassname obj) {
272     return (obj == null) ? 0 : obj.swigCPtr;
273   }
274 
swigSetCMemOwn(boolean own)275   CPTR_VISIBILITY void swigSetCMemOwn(boolean own) {
276     swigCMemOwnDerived = own;
277     super.swigSetCMemOwn(own);
278   }
279 %}
280 
281 %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE {
282     if (swigCPtr != 0) {
283       if (swigCMemOwn) {
284         swigCMemOwn = false;
285         $jnicall;
286       }
287       swigCPtr = 0;
288     }
289   }
290 
291 %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE {
292     if (swigCPtr != 0) {
293       if (swigCMemOwnDerived) {
294         swigCMemOwnDerived = false;
295         $jnicall;
296       }
297       swigCPtr = 0;
298     }
299     super.delete();
300   }
301 
302 %typemap(directordisconnect, methodname="swigDirectorDisconnect") TYPE %{
$methodname()303   protected void $methodname() {
304     swigSetCMemOwn(false);
305     $jnicall;
306   }
307 %}
308 
309 %typemap(directorowner_release, methodname="swigReleaseOwnership") TYPE %{
$methodname()310   public void $methodname() {
311     swigSetCMemOwn(false);
312     $jnicall;
313   }
314 %}
315 
316 %typemap(directorowner_take, methodname="swigTakeOwnership") TYPE %{
$methodname()317   public void $methodname() {
318     swigSetCMemOwn(true);
319     $jnicall;
320   }
321 %}
322 
323 // Typecheck typemaps
324 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *")
325   TYPE CONST,
326   TYPE CONST &,
327   TYPE CONST *,
328   TYPE *CONST&,
329   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >,
330   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &,
331   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *,
332   SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *&
333   ""
334 
335 %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >;
336 %enddef
337 
338