diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2022-10-17 20:13:32 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2022-10-17 20:14:45 +0100 |
commit | d8a028601247e96c15bbaac08100cce0401f186e (patch) | |
tree | 95a91cdbeaf3fa896a2387ac994ff7375f7064c4 /Lib | |
parent | d58eb86821d2da4e97bf0a1f729fbf8172edfa98 (diff) | |
download | swig-d8a028601247e96c15bbaac08100cce0401f186e.tar.gz |
R - Add support for std::vector<std::vector<std::string>>
Closes #2385
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/r/std_vector.i | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/Lib/r/std_vector.i b/Lib/r/std_vector.i index 93d1c6256..62478fe6a 100644 --- a/Lib/r/std_vector.i +++ b/Lib/r/std_vector.i @@ -660,6 +660,27 @@ } }; + template <> + struct traits_from_ptr<std::vector<std::vector<std::basic_string<char> > > > { + static SEXP from (std::vector< std::vector<std::basic_string<char> > > *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 <typename T> struct traits_from_ptr< std::vector < std::vector< T > > > { static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) { @@ -887,8 +908,6 @@ std::vector< std::basic_string<char> > *, std::vector< std::basic_string<char> > & %{ %} -%apply std::vector< std::basic_string<char> > { std::vector< std::string> }; - // all the related integer vectors // signed %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<signed char>); @@ -1005,6 +1024,13 @@ std::vector< std::basic_string<char> > *, %typemap("rtype") std::vector<std::vector<bool> >, std::vector<std::vector<bool> > *, std::vector<std::vector<bool> > & "list" %typemap("scoercein") std::vector< std::vector<bool> >, std::vector<std::vector<bool> > *, std::vector<std::vector<bool> > & "$input = lapply($input, as.logical);" +%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<std::basic_string<char> > >); +%traits_type_name(std::vector< std::vector<std::basic_string<char> > >); +%typemap("rtypecheck") std::vector<std::vector<std::basic_string<char> > >, std::vector<std::vector<std::basic_string<char> > > *, std::vector<std::vector<std::basic_string<char> > > & + %{ is.list($arg) && all(sapply($arg , is.character)) %} +%typemap("rtype") std::vector<std::vector<std::basic_string<char> > >, std::vector<std::vector<std::basic_string<char> > > *, std::vector<std::vector<std::basic_string<char> > > & "list" +%typemap("scoercein") std::vector< std::vector<std::basic_string<char> > >, std::vector<std::vector<std::basic_string<char> > > *, std::vector<std::vector<std::basic_string<char> > > & "$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<double>, @@ -1049,7 +1075,10 @@ std::vector< std::basic_string<char> > *, std::vector< std::vector<double> >&, std::vector< std::vector<bool> >, std::vector< std::vector<bool> >*, - std::vector< std::vector<bool> >& + std::vector< std::vector<bool> >&, + std::vector< std::vector<std::basic_string<char> > >, + std::vector< std::vector<std::basic_string<char> > >*, + std::vector< std::vector<std::basic_string<char> > >& %{ %} #if defined(SWIGWORDSIZE64) @@ -1071,3 +1100,6 @@ std::vector< std::basic_string<char> > *, %{ %} #endif + +%apply std::vector< std::basic_string<char> > { std::vector<std::string> }; +%apply std::vector< std::vector< std::basic_string<char> > > { std::vector< std::vector<std::string> > }; |