// R specific swig components /* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { // vectors of doubles template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of floats template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 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 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) { 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 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 > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(LGLSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { LOGICAL_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of strings template <> struct traits_from_ptr > > { static SEXP from (std::vector > *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(STRSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { CHARACTER_POINTER(result)[pos] = Rf_mkChar(((*val)[pos]).c_str()); } UNPROTECT(1); return(result); } }; // catch all that does everything with vectors template struct traits_from_ptr< std::vector< T > > { static SEXP from (std::vector< T > *val, int owner = 0) { 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) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); 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; } 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 unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); 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; } return res; } }; // 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) { 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; } }; #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) { 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, LGLSXP)); int *S = LOGICAL_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; // R character vectors are STRSXP containing CHARSXP // access a CHARSXP using STRING_ELT int sexpsz = Rf_length(obj); p = new std::vector >(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, STRSXP)); //SEXP *S = CHARACTER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { const char * thecstring = CHAR(STRING_ELT(coerced, pos)); (*p)[pos] = std::basic_string(thecstring); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // catchall for R to vector conversion template struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; int res = SWIG_ConvertPtr(obj, (void**)&p, type_info< std::vector >(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // now for vectors of vectors. These will be represented as lists of vectors on the // catch all that does everything with vectors template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(LGLSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { LOGICAL_POINTER(VECTOR_ELT(result, pos))[vpos] = (val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > > { static SEXP from (std::vector< std::vector > > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(STRSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { CHARACTER_POINTER(VECTOR_ELT(result, pos))[vpos] = Rf_mkChar(val->at(pos).at(vpos).c_str()); } } UNPROTECT(1); return(result); } }; template struct traits_from_ptr< std::vector < std::vector< T > > > { static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector < std::vector< T > > >(), owner); } }; ///////////////////////////////////////////////////////////////// // R side template <> struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< int> > > { static int asptr(SEXP obj, std::vector< std::vector< int> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< int> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< float> > > { static int asptr(SEXP obj, std::vector< std::vector< float> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< float> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< double> > > { static int asptr(SEXP obj, std::vector< std::vector< double> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< double> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< bool > > > { static int asptr(SEXP obj, std::vector< std::vector< bool> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< bool > > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(LOGICAL_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // catchall template struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector< std::vector > *p; Rprintf("vector of vectors - unsupported content\n"); int res = SWIG_ConvertPtr(obj, (void**)&p, type_info< std::vector< std::vector > > (), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %define %traits_type_name(Type...) %fragment(SWIG_Traits_frag(Type), "header", fragment="StdTraits",fragment="StdVectorTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef %include %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.numeric($arg) %} %typemap("rtype") std::vector "numeric" %typemap("scoercein") std::vector, std::vector *, std::vector & "$input = as.numeric($input);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) // reuse these for float %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.logical($arg) %} %typemap("rtype") std::vector "logical" %typemap("scoercein") std::vector , std::vector & "$input = as.logical($input);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtype") std::vector "integer" %typemap("scoercein") std::vector , std::vector *, std::vector & "$input = as.integer($input);" // strings %typemap("rtype") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "character" %typemap("rtypecheck") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ is.character($arg) %} %typemap("scoercein") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "$input = as.character($input);"; %typemap("scoerceout") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ %} // 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); #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 *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #endif /////////////////////////////////////////////////////////////// %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.logical);" %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector > >); %traits_type_name(std::vector< std::vector > >); %typemap("rtypecheck") std::vector > >, std::vector > > *, std::vector > > & %{ is.list($arg) && all(sapply($arg , is.character)) %} %typemap("rtype") std::vector > >, std::vector > > *, std::vector > > & "list" %typemap("scoercein") std::vector< std::vector > >, std::vector > > *, std::vector > > & "$input = lapply($input, as.character);" // 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&, // vectors of vectors 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 > >*, 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 %apply std::vector< std::basic_string > { std::vector }; %apply std::vector< std::vector< std::basic_string > > { std::vector< std::vector > };