diff options
Diffstat (limited to 'Lib/r/rtype.swg')
| -rw-r--r-- | Lib/r/rtype.swg | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/Lib/r/rtype.swg b/Lib/r/rtype.swg new file mode 100644 index 0000000..d388d1e --- /dev/null +++ b/Lib/r/rtype.swg @@ -0,0 +1,188 @@ + +/* These map the primitive C types to the appropriate R type + for use in class representations. + */ + +%typemap("rtype") int, int *, int & "integer"; +%apply int {size_t} +%apply int {std::size_t} +%apply int {ptrdiff_t} +%apply int {std::ptrdiff_t} +%apply int {signed int} +%apply int {unsigned int} +%apply int {short} +%apply int {unsigned short} + +%typemap("rtype") long, long *, long & "integer"; +%apply long {long long} +%apply long {signed long long} +%apply long {unsigned long long} +%apply long {signed long} +%apply long {unsigned long} + +%typemap("rtype") double, double*, double & "numeric"; +%typemap("rtype") float, float *, float & "numeric"; +%typemap("rtype") char *, char ** "character"; +%typemap("rtype") char "character"; +%typemap("rtype") string, string *, string & "character"; +%typemap("rtype") std::string, std::string *, std::string & "character"; +%typemap("rtype") bool, bool * "logical"; +%typemap("rtype") enum SWIGTYPE "character"; +%typemap("rtype") enum SWIGTYPE * "character"; +%typemap("rtype") enum SWIGTYPE & "character"; +%typemap("rtype") SWIGTYPE * "$R_class"; +%typemap("rtype") SWIGTYPE & "$R_class"; +%typemap("rtype") SWIGTYPE "$&R_class"; + + + +/* Have to be careful that as(x, "numeric") is different from as.numeric(x). + The latter makes a REALSXP, whereas the former leaves an INTSXP as an + INTSXP. +*/ + +/* Force coercion of integer, since by default R sets all constants to + numeric, which means that you can't directly call a function with an + integer using an R numercal literal */ + +%typemap(scoercein) int, int *, int & + %{ $input = as.integer($input); %} +%typemap(scoercein) long, long *, long & + %{ $input = as.integer($input); %} +%typemap(scoercein) double, double *, double & + %{ %} +%typemap(scoercein) float, float *, float & + %{ %} +%typemap(scoercein) char, char *, char & + %{ $input = as($input, "character"); %} +%typemap(scoercein) string, string *, string & + %{ $input = as($input, "character"); %} +%typemap(scoercein) std::string, std::string *, std::string & + %{ $input = as($input, "character"); %} +%typemap(scoercein) enum SWIGTYPE + %{ $input = enumToInteger($input, "$R_class") %} +%typemap(scoercein) enum SWIGTYPE & + %{ $input = enumToInteger($input, "$R_class") %} +%typemap(scoercein) enum SWIGTYPE * + %{ $input = enumToInteger($input, "$R_class") %} + + +%typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE & + %{ %} + +/* +%typemap(scoercein) SWIGTYPE * + %{ $input = coerceIfNotSubclass($input, "$R_class") %} + +%typemap(scoercein) SWIGTYPE & + %{ $input = coerceIfNotSubclass($input, "$R_class") %} + +%typemap(scoercein) SWIGTYPE + %{ $input = coerceIfNotSubclass($input, "$&R_class") %} +*/ + +%typemap(scoercein) SWIGTYPE[ANY] + %{ + if(is.list($input)) + assert(all(sapply($input, class) == "$R_class")) + %} + + +/* **************************************************************** */ + +%typemap(scoercein) bool, bool *, bool & + "$input = as.logical($input) "; +%typemap(scoercein) int, + int *, + int &, + int[ANY], + long, + long *, + long &, + long[ANY] + "$input = as.integer($input) "; + +%typemap(scoercein) char *, string, std::string, +string &, std::string & +%{ $input = as($input, "character") %} + +%typemap(scoerceout) enum SWIGTYPE + %{ $result = enumFromInteger($result, "$R_class") %} + +%typemap(scoerceout) enum SWIGTYPE & + %{ $result = enumFromInteger($result, "$R_class") %} + +%typemap(scoerceout) enum SWIGTYPE * + %{ $result = enumToInteger($result, "$R_class") %} + + +%typemap(scoerceout) SWIGTYPE + %{ class($result) <- "$&R_class" %} + +%typemap(scoerceout) SWIGTYPE & + %{ class($result) <- "$R_class" %} + +%typemap(scoerceout) SWIGTYPE * + %{ class($result) <- "$R_class" %} + +/* Override the SWIGTYPE * above. */ +%typemap(scoerceout) char, + char *, + char &, + double, + double &, + float, + float &, + int, + int &, + long, + long &, + bool, + bool &, + string, + std::string, + string &, + std::string &, + void, + signed int, + signed int &, + unsigned int, + unsigned int &, + short, + short &, + unsigned short, + unsigned short &, + long long, + signed long long, + signed long long &, + unsigned long long, + unsigned long long &, + signed long, + signed long &, + unsigned long, + unsigned long & + %{ %} + + +#if 0 + Just examining the values for a SWIGTYPE. + +%typemap(scoerceout) SWIGTYPE %{ + + name = $1_name + type = $1_type + ltype = $1_ltype + + mangle = $1_mangle + descriptor = $1_descriptor + + pointer type = $*1_type + pointer ltype = $*1_ltype + + pointer descriptor = $*1_descriptor + basetype = $*_basetype + +%} +#endif + + |
