/* 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