summaryrefslogtreecommitdiff
path: root/Lib/r/rtype.swg
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/r/rtype.swg')
-rw-r--r--Lib/r/rtype.swg188
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
+
+