Home | History | Annotate | Download | only in typemaps
      1 /* -----------------------------------------------------------------------------
      2  * ptrtypes.swg
      3  *
      4  * Value typemaps (Type, const Type&) for "Ptr" types, such as swig
      5  * wrapped classes, that define the AsPtr/From methods
      6  *
      7  * To apply them, just use one of the following macros:
      8  *
      9  *    %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type)
     10  *    %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type)
     11  *
     12  * or the simpler and normalize form:
     13  *
     14  *    %typemaps_asptrfromn(CheckCode, Type)
     15  *
     16  * Also, you can use the individual typemap definitions:
     17  *
     18  *    %ptr_in_typemap(asptr_meth,frag,Type)
     19  *    %ptr_varin_typemap(asptr_meth,frag,Type)
     20  *    %ptr_typecheck_typemap(check,asptr_meth,frag,Type)
     21  *    %ptr_directorout_typemap(asptr_meth,frag,Type)
     22  * ----------------------------------------------------------------------------- */
     23 
     24 %include <typemaps/valtypes.swg>
     25 
     26 /* in */
     27 
     28 %define %ptr_in_typemap(asptr_meth,frag,Type...)
     29   %typemap(in,fragment=frag) Type {
     30     Type *ptr = (Type *)0;
     31     int res = asptr_meth($input, &ptr);
     32     if (!SWIG_IsOK(res) || !ptr) {
     33       %argument_fail((ptr ? res : SWIG_TypeError), "$type", $symname, $argnum);
     34     }
     35     $1 = *ptr;
     36     if (SWIG_IsNewObj(res)) %delete(ptr);
     37   }
     38   %typemap(freearg) Type "";
     39   %typemap(in,fragment=frag) const Type & (int res = SWIG_OLDOBJ) {
     40     Type *ptr = (Type *)0;
     41     res = asptr_meth($input, &ptr);
     42     if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); }
     43     if (!ptr) { %argument_nullref("$type",$symname, $argnum); }
     44     $1 = ptr;
     45   }
     46   %typemap(freearg,noblock=1) const Type &  {
     47     if (SWIG_IsNewObj(res$argnum)) %delete($1);
     48   }
     49 %enddef
     50 
     51 /* varin */
     52 
     53 %define %ptr_varin_typemap(asptr_meth,frag,Type...)
     54   %typemap(varin,fragment=frag) Type {
     55     Type *ptr = (Type *)0;
     56     int res = asptr_meth($input, &ptr);
     57     if (!SWIG_IsOK(res) || !ptr) {
     58       %variable_fail((ptr ? res : SWIG_TypeError), "$type", "$name");
     59     }
     60     $1 = *ptr;
     61     if (SWIG_IsNewObj(res)) %delete(ptr);
     62   }
     63 %enddef
     64 
     65 #if defined(SWIG_DIRECTOR_TYPEMAPS)
     66 /* directorout */
     67 
     68 %define %ptr_directorout_typemap(asptr_meth,frag,Type...)
     69   %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT ($*ltype temp, int swig_ores) {
     70     Type *swig_optr = 0;
     71     swig_ores = $result ? asptr_meth($result, &swig_optr) : 0;
     72     if (!SWIG_IsOK(swig_ores) || !swig_optr) {
     73       %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type");
     74     }
     75     temp = *swig_optr;
     76     $1 = &temp;
     77     if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr);
     78   }
     79 
     80   %typemap(directorout,noblock=1,fragment=frag) Type {
     81     Type *swig_optr = 0;
     82     int swig_ores = asptr_meth($input, &swig_optr);
     83     if (!SWIG_IsOK(swig_ores) || !swig_optr) {
     84       %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type");
     85     }
     86     $result = *swig_optr;
     87     if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr);
     88   }
     89 
     90   %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type* {
     91     Type *swig_optr = 0;
     92     int swig_ores = asptr_meth($input, &swig_optr);
     93     if (!SWIG_IsOK(swig_ores)) {
     94       %dirout_fail(swig_ores,"$type");
     95     }
     96     $result = swig_optr;
     97     if (SWIG_IsNewObj(swig_ores)) {
     98       swig_acquire_ownership(swig_optr);
     99     }
    100   }
    101   %typemap(directorfree,noblock=1) Type*
    102   {
    103     if (director)  {
    104       director->swig_release_ownership(%as_voidptr($input));
    105     }
    106   }
    107 
    108   %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type& {
    109     Type *swig_optr = 0;
    110     int swig_ores = asptr_meth($input, &swig_optr);
    111     if (!SWIG_IsOK(swig_ores)) {
    112       %dirout_fail(swig_ores,"$type");
    113     } else {
    114       if (!swig_optr) {
    115 	%dirout_nullref("$type");
    116       }
    117     }
    118     $result = swig_optr;
    119     if (SWIG_IsNewObj(swig_ores)) {
    120       swig_acquire_ownership(swig_optr);
    121     }
    122   }
    123   %typemap(directorfree,noblock=1) Type&
    124   {
    125     if (director) {
    126       director->swig_release_ownership(%as_voidptr($input));
    127     }
    128   }
    129 
    130 
    131   %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type
    132 
    133 %enddef
    134 
    135 #else
    136 
    137 #define %ptr_directorout_typemap(asptr_meth,frag,Type...)
    138 
    139 #endif /* SWIG_DIRECTOR_TYPEMAPS */
    140 
    141 /* typecheck */
    142 
    143 %define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...)
    144 %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type * {
    145   int res = asptr_meth($input, (Type**)(0));
    146   $1 = SWIG_CheckState(res);
    147 }
    148 
    149 %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type, const Type& {
    150   int res = asptr_meth($input, (Type**)(0));
    151   $1 = SWIG_CheckState(res);
    152 }
    153 %enddef
    154 
    155 
    156 /*---------------------------------------------------------------------
    157  * typemap definition for types with asptr method
    158  *---------------------------------------------------------------------*/
    159 
    160 %define %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type...)
    161   %fragment(SWIG_AsVal_frag(Type),"header",fragment=SWIG_AsPtr_frag(Type)) {
    162     SWIGINTERNINLINE int
    163     SWIG_AsVal(Type)(SWIG_Object obj, Type *val)
    164     {
    165       Type *v = (Type *)0;
    166       int res = SWIG_AsPtr(Type)(obj, &v);
    167       if (!SWIG_IsOK(res)) return res;
    168       if (v) {
    169 	if (val) *val = *v;
    170 	if (SWIG_IsNewObj(res)) {
    171 	  %delete(v);
    172 	  res = SWIG_DelNewMask(res);
    173 	}
    174 	return res;
    175       }
    176       return SWIG_ERROR;
    177     }
    178   }
    179   %ptr_in_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type);
    180   %ptr_varin_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type);
    181   %ptr_directorout_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type);
    182   %ptr_typecheck_typemap(%arg(CheckCode), %arg(AsPtrMeth),%arg(AsPtrFrag), Type);
    183   %ptr_input_typemap(%arg(CheckCode),%arg(AsPtrMeth),%arg(AsPtrFrag),Type);
    184 %enddef
    185 
    186 /*---------------------------------------------------------------------
    187  * typemap definition for types with asptr/from methods
    188  *---------------------------------------------------------------------*/
    189 
    190 %define %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type...)
    191   %typemaps_asptr(%arg(CheckCode), %arg(AsPtrMeth), %arg(AsPtrFrag), Type)
    192   %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type);
    193   %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type);
    194   %ptr_inout_typemap(Type);
    195 %enddef
    196 
    197 /*---------------------------------------------------------------------
    198  * typemap definition for types  with for 'normalized' asptr/from methods
    199  *---------------------------------------------------------------------*/
    200 
    201 %define %typemaps_asptrfromn(CheckCode, Type...)
    202 %typemaps_asptrfrom(%arg(CheckCode),
    203 		   %arg(SWIG_AsPtr(Type)),
    204 		   %arg(SWIG_From(Type)),
    205 		   %arg(SWIG_AsPtr_frag(Type)),
    206 		   %arg(SWIG_From_frag(Type)),
    207 		   Type);
    208 %enddef
    209