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