diff --git a/Lib/r/std_vector.i b/Lib/r/std_vector.i index 836c95b53..d10097c1e 100644 --- a/Lib/r/std_vector.i +++ b/Lib/r/std_vector.i @@ -34,10 +34,10 @@ return(result); } }; - // vectors of unsigned int + // vectors of unsigned 8bit int template <> - struct traits_from_ptr > { - static SEXP from (std::vector *val, int owner = 0) { + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) @@ -48,7 +48,66 @@ return(result); } }; - // vectors of int + // vectors of 8bit int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + + // vectors of unsigned 16bit int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + // vectors of 16bit int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + + // vectors of 32 bit unsigned int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + + // vectors of 32bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { @@ -63,6 +122,64 @@ } }; + // vectors of 64 bit unsigned int +#if defined(SWIGWORDSIZE64) + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + // vectors of 64 bit int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; +#else + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; + // vectors of 64 bit int + template <> + struct traits_from_ptr > { + static SEXP from (std::vector *val, int owner = 0) { + SEXP result; + PROTECT(result = Rf_allocVector(INTSXP, val->size())); + for (unsigned pos = 0; pos < val->size(); pos++) + { + INTEGER_POINTER(result)[pos] = ((*val)[pos]); + } + UNPROTECT(1); + return(result); + } + }; +#endif // vectors of bool template <> struct traits_from_ptr > { @@ -78,6 +195,7 @@ //return SWIG_R_NewPointerObj(val, type_info< std::vector >(), owner); } }; + // vectors of strings template <> struct traits_from_ptr > > { @@ -101,7 +219,7 @@ return SWIG_R_NewPointerObj(val, type_info< std::vector< T > >(), owner); } }; - + ///////////////////////////////////////////////// template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { @@ -142,6 +260,98 @@ } }; + // 8 bit integer types + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + unsigned int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + // not sure how to check the size of the SEXP obj is correct + int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + + // 16 bit integer types + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + unsigned int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + // not sure how to check the size of the SEXP obj is correct + int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + // 32 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { @@ -187,6 +397,102 @@ } }; +#if defined(SWIGWORDSIZE64) + // 64 bit integer types + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + unsigned int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + // not sure how to check the size of the SEXP obj is correct + int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + +#else + // 64 bit integer types + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + unsigned int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + + template <> + struct traits_asptr < std::vector > { + static int asptr(SEXP obj, std::vector **val) { + std::vector *p; + // not sure how to check the size of the SEXP obj is correct + int sexpsz = Rf_length(obj); + p = new std::vector(sexpsz); + SEXP coerced; + PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); + int *S = INTEGER_POINTER(coerced); + for (unsigned pos = 0; pos < p->size(); pos++) + { + (*p)[pos] = static_cast(S[pos]); + } + int res = SWIG_OK; + if (SWIG_IsOK(res)) { + if (val) *val = p; + } + UNPROTECT(1); + return res; + } + }; + +#endif + template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { @@ -228,7 +534,7 @@ // catch all that does everything with vectors template <> struct traits_from_ptr > > { - static SEXP from (std::vector< std::vector > *val, int owner = 0) { + static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); @@ -247,6 +553,7 @@ } }; + template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { @@ -338,6 +645,8 @@ } }; + ///////////////////////////////////////////////////////////////// + // R side template <> struct traits_asptr < std::vector< std::vector > > { @@ -514,10 +823,12 @@ %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) -%typemap("rtypecheck") std::vector, std::vector const, std::vector const& - %{ is.numeric($arg) %} -%typemap("rtype") std::vector "numeric" -%typemap("scoercein") std::vector, std::vector const, std::vector const& ""; + +// reuse these for float +%typemap("rtype") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; + %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); @@ -526,26 +837,94 @@ %typemap("rtype") std::vector "logical" %typemap("scoercein") std::vector , std::vector const, std::vector const& "$input = as.logical($input);"; + %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); -%typemap("rtypecheck") std::vector , std::vector const, std::vector const& +%typemap("rtypecheck") std::vector, std::vector const, std::vector const & %{ is.integer($arg) || is.numeric($arg) %} + %typemap("rtype") std::vector "integer" %typemap("scoercein") std::vector , std::vector const, std::vector const& "$input = as.integer($input);"; +// all the related integer vectors +// signed +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); + +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); + +#if defined(SWIGWORDSIZE64) +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); +#else +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); +#endif + +// unsigned +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); + +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); + %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); -%typemap("rtypecheck") std::vector, std::vector const, std::vector const& -%{ is.integer($arg) || is.numeric($arg) %} -%typemap("rtype") std::vector "integer" -%typemap("scoercein") std::vector, std::vector const, std::vector const& "$input = as.integer($input);"; -%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); -%traits_type_name(std::vector< std::vector >); -%typemap("rtypecheck") std::vector >, std::vector > const, std::vector >const& - %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} -%typemap("rtype") std::vector > "list" -%typemap("scoercein") std::vector< std::vector >, std::vector > const, std::vector >const& "$input = lapply($input, as.integer);"; +#if defined(SWIGWORDSIZE64) +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); +#else +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); +%traits_type_name(std::vector); +#endif + +// These R side typemaps are common for integer types +// but we can't use %apply as it will copy the C side ones too +// Also note that we don't seem to be able to use types like +// int_least8_t here. +%typemap("rtype") std::vector = std::vector; +%typemap("rtype") std::vector = std::vector; +%typemap("rtype") std::vector = std::vector; +%typemap("rtype") std::vector = std::vector; + +#if defined(SWIGWORDSIZE64) +%typemap("rtype") std::vector = std::vector; +%typemap("rtype") std::vector = std::vector; +#else +%typemap("rtype") std::vector = std::vector; +%typemap("rtype") std::vector = std::vector; +#endif + + +%typemap("scoercein") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; + +#if defined(SWIGWORDSIZE64) +%typemap("scoercein") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; +#else +%typemap("scoercein") std::vector = std::vector; +%typemap("scoercein") std::vector = std::vector; +#endif + +%typemap("rtypecheck") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; + +#if defined(SWIGWORDSIZE64) +%typemap("rtypecheck") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; +#else +%typemap("rtypecheck") std::vector = std::vector; +%typemap("rtypecheck") std::vector = std::vector; +#endif + +/////////////////////////////////////////////////////////////// %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); @@ -579,14 +958,32 @@ // we don't want these to be given R classes as they // have already been turned into R vectors. %typemap(scoerceout) std::vector, - std::vector *, - std::vector &, - std::vector, - std::vector *, - std::vector &, + std::vector*, + std::vector&, + std::vector , + std::vector*, + std::vector , + std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector&, std::vector, - std::vector *, - std::vector &, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector&, // vectors of vectors std::vector< std::vector >, std::vector< std::vector >*, @@ -603,6 +1000,24 @@ std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >& - - %{ %} + +#if defined(SWIGWORDSIZE64) +%typemap(scoerceout) std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector& + %{ %} +#else + +%typemap(scoerceout) std::vector, + std::vector*, + std::vector&, + std::vector, + std::vector*, + std::vector& + %{ %} + +#endif