1/*---------------------------------------------------------------------
2 * Value typemaps (Type, const Type&) for value types, such as
3 * fundamental types (int, double), that define the AsVal/From
4 * methods.
5 *
6 * To apply them, just use one of the following macros:
7 *
8 *   %typemaps_from(FromMeth, FromFrag, Type)
9 *   %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type)
10 *   %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type)
11 *
12 * or the simpler and normalize form:
13 *
14 *   %typemaps_asvalfromn(CheckCode, Type)
15 *
16 * Also, you can use the individual typemap definitions:
17 *
18 *    %value_in_typemap(asval_meth,frag,Type)
19 *    %value_varin_typemap(asval_meth,frag,Type)
20 *    %value_typecheck_typemap(checkcode,asval_meth,frag,Type)
21 *    %value_directorout_typemap(asval_meth,frag,Type)
22 *
23 *    %value_out_typemap(from_meth,frag,Type)
24 *    %value_varout_typemap(from_meth,frag,Type)
25 *    %value_constcode_typemap(from_meth,frag,Type)
26 *    %value_directorin_typemap(from_meth,frag,Type)
27 *    %value_throws_typemap(from_meth,frag,Type)
28 *
29 *---------------------------------------------------------------------*/
30
31/* in */
32
33%define %value_in_typemap(asval_meth,frag,Type...)
34  %typemap(in,noblock=1,fragment=frag) Type (Type val, int ecode = 0) {
35    ecode = asval_meth($input, &val);
36    if (!SWIG_IsOK(ecode)) {
37      %argument_fail(ecode, "$ltype", $symname, $argnum);
38    }
39    $1 = %static_cast(val,$ltype);
40  }
41  %typemap(freearg) Type "";
42  %typemap(in,noblock=1,fragment=frag) const Type & ($*ltype temp, Type val, int ecode = 0) {
43    ecode = asval_meth($input, &val);
44    if (!SWIG_IsOK(ecode)) {
45      %argument_fail(ecode, "$*ltype", $symname, $argnum);
46    }
47    temp = %static_cast(val, $*ltype);
48    $1 = &temp;
49  }
50  %typemap(freearg) const Type& "";
51%enddef
52
53/* out */
54
55%define %value_out_typemap(from_meth,frag,Type...)
56  %typemap(out,noblock=1,fragment=frag) Type, const Type {
57    %set_output(from_meth(%static_cast($1,Type)));
58  }
59  %typemap(out,noblock=1,fragment=frag) const Type& {
60    %set_output(from_meth(%static_cast(*$1,Type)));
61  }
62%enddef
63
64/* varin */
65
66%define %value_varin_typemap(asval_meth,frag,Type...)
67  %typemap(varin,fragment=frag) Type {
68    Type val;
69    int res = asval_meth($input, &val);
70    if (!SWIG_IsOK(res)) {
71      %variable_fail(res, "$type", "$name");
72    }
73    $1 = %static_cast(val,$ltype);
74  }
75%enddef
76
77/* varout */
78
79%define %value_varout_typemap(from_meth,frag,Type...)
80  %typemap(varout,noblock=1,fragment=frag) Type, const Type&  {
81    %set_varoutput(from_meth(%static_cast($1,Type)));
82  }
83%enddef
84
85/* constant installation code */
86
87%define %value_constcode_typemap(from_meth,frag,Type...)
88  %typemap(constcode,noblock=1,fragment=frag) Type {
89    %set_constant("$symname", from_meth(%static_cast($value,Type)));
90  }
91%enddef
92
93
94#if defined(SWIG_DIRECTOR_TYPEMAPS)
95
96/* directorin */
97
98%define %value_directorin_typemap(from_meth,frag,Type...)
99  %typemap(directorin,noblock=1,fragment=frag) Type *DIRECTORIN {
100    $input = from_meth(%static_cast(*$1_name,Type));
101  }
102  %typemap(directorin,noblock=1,fragment=frag) Type, const Type& {
103    $input = from_meth(%static_cast($1_name,Type));
104  }
105%enddef
106
107/* directorout */
108
109%define %value_directorout_typemap(asval_meth,frag,Type...)
110  %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT {
111    Type swig_val;
112    int swig_res = asval_meth($input, &swig_val);
113    if (!SWIG_IsOK(swig_res)) {
114      %dirout_fail(swig_res, "$type");
115    }
116    *$result = %static_cast(swig_val, $type);
117  }
118  %typemap(directorout,noblock=1,fragment=frag) Type {
119    Type swig_val;
120    int swig_res = asval_meth($input, &swig_val);
121    if (!SWIG_IsOK(swig_res)) {
122      %dirout_fail(swig_res, "$type");
123    }
124    $result = %static_cast(swig_val,$type);
125  }
126  %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const Type& {
127    Type swig_val;
128    int swig_res = asval_meth($input, &swig_val);
129    if (!SWIG_IsOK(swig_res)) {
130      %dirout_fail(swig_res, "$type");
131    }
132    $basetype *temp = new $basetype(($basetype)swig_val);
133    swig_acquire_ownership(temp);
134    $result = temp;
135  }
136  %typemap(directorfree,noblock=1) const Type & {
137    if (director) {
138      director->swig_release_ownership(%as_voidptr($input));
139    }
140  }
141  %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type
142%enddef
143
144#else
145
146#define %value_directorin_typemap(from_meth,frag,Type...)
147#define %value_directorout_typemap(asval_meth,frag,Type...)
148
149#endif /* SWIG_DIRECTOR_TYPEMAPS */
150
151
152/* throws */
153
154%define %value_throws_typemap(from_meth,frag,Type...)
155  %typemap(throws,noblock=1,fragment=frag) Type {
156    %raise(from_meth(%static_cast($1,Type)), "$type", 0);
157  }
158%enddef
159
160/* typecheck */
161
162%define %value_typecheck_typemap(check,asval_meth,frag,Type...)
163  %typemap(typecheck,precedence=check,fragment=frag) Type, const Type& {
164    int res = asval_meth($input, NULL);
165    $1 = SWIG_CheckState(res);
166  }
167%enddef
168
169/*---------------------------------------------------------------------
170 * typemap definition for types with AsVal methods
171 *---------------------------------------------------------------------*/
172%define %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type...)
173  %value_in_typemap(%arg(AsValMeth), %arg(AsValFrag), Type);
174  %value_varin_typemap(%arg(AsValMeth), %arg(AsValFrag), Type);
175  %value_directorout_typemap(%arg(AsValMeth), %arg(AsValFrag), Type);
176  %value_typecheck_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type);
177  %value_input_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type);
178%enddef
179
180
181/*---------------------------------------------------------------------
182 * typemap definition for types with from method
183 *---------------------------------------------------------------------*/
184%define %typemaps_from(FromMeth, FromFrag, Type...)
185  %value_out_typemap(%arg(FromMeth), %arg(FromFrag), Type);
186  %value_varout_typemap(%arg(FromMeth), %arg(FromFrag), Type);
187  %value_constcode_typemap(%arg(FromMeth), %arg(FromFrag), Type);
188  %value_directorin_typemap(%arg(FromMeth), %arg(FromFrag), Type);
189  %value_throws_typemap(%arg(FromMeth), %arg(FromFrag), Type);
190  %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type);
191%enddef
192
193
194/*---------------------------------------------------------------------
195 * typemap definition for types with alval/from method
196 *---------------------------------------------------------------------*/
197
198%define %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth,
199			   AsValFrag, FromFrag, Type...)
200  %typemaps_asval(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type);
201  %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type);
202  %value_inout_typemap(Type);
203%enddef
204
205
206/*---------------------------------------------------------------------
207 * typemap definition for types  with for 'normalized' asval/from methods
208 *---------------------------------------------------------------------*/
209%define %typemaps_asvalfromn(CheckCode, Type...)
210  %typemaps_asvalfrom(%arg(CheckCode),
211		     SWIG_AsVal(Type),
212		     SWIG_From(Type),
213		     %arg(SWIG_AsVal_frag(Type)),
214		     %arg(SWIG_From_frag(Type)),
215		     Type);
216%enddef
217