[Rcpp-devel] returning pointers in module methods

Romain Francois romain at r-enthusiasts.com
Tue Jun 7 15:44:13 CEST 2011


Now, obviously, the next (perhaps more complicated) step is to allow 
pointers as inputs.

This is a task for another day ...

Le 07/06/11 15:35, Romain Francois a écrit :
> Hello,
>
> I've added a few things in modules to extend the possibilities of return
> types from a method that is exposed.
>
> So, it is now possible for a method to return a pointer to an other (or
> the same) class. There is a small example below.
>
> Here we expose two classes FOO and Bar. The interesting bits are the
> methods "clone" and "mult" in FOO and the method "make_foo" in Bar.
>
> The return type is result<T> instead of T*, but the method should return
> a T*, i.e. the result template class looks like this:
>
> template <typename T>
> class result {
> public:
> result( T* ptr_ ) : ptr(ptr_){}
> operator T*(){ return ptr ; }
> private:
> T* ptr;
> } ;
>
> As usual when we come up with new features, please try them, and send
> feedback. Maybe you feel result is not a good name, maybe you have
> another idea, ...
>
> Romain
>
>
>
>
>
> require(inline)
> require(Rcpp)
>
> fx <- cxxfunction( , '', includes = '
>
> class FOO{
> public:
> FOO( double x_, double y_): x(x_), y(y_){}
>
> double x ;
> double y ;
>
> void move( double dx, double dy){
> x += dx ;
> y += dy ;
> }
>
> result<FOO> clone(){
> return new FOO(x,y) ;
> }
>
> result<FOO> mult(double z){
> return new FOO(z*x,z*y) ;
> }
>
> } ;
>
> class Bar {
> public:
> Bar( double x_ ) : x(x_){}
>
> double x ;
>
> result<FOO> make_foo(){
> return new FOO(x,x) ;
> }
> } ;
>
>
> RCPP_MODULE(mod){
>
> class_<FOO>("FOO" )
>
> .constructor<double,double>()
>
> .field( "x", &FOO::x )
> .field( "y", &FOO::y )
>
> .method( "move", &FOO::move )
>
> .method( "clone", &FOO::clone )
> .method( "mult", &FOO::mult )
> ;
>
> class_<Bar>("Bar")
> .constructor<double>()
> .field( "x", &Bar::x )
> .method( "make_foo", &Bar::make_foo )
> ;
> }
>
>
> ', plugin = "Rcpp" )
> mod <- Module( "mod", getDynLib(fx),mustStart = TRUE )
>
> # grab the exposed C++ class
> FOO <- mod$FOO
> Bar <- mod$Bar
>
> f <- new( FOO, 2, 3 )
> g <- f$clone()
> h <- f$mult(2)
>
> b <- new( Bar, 2 )
> z <- b$make_foo()
> z$x
> z$y
>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/kaSV6U : Stand up set at Up The Creek
|- http://bit.ly/hdKhCy : Rcpp article in JSS
`- http://bit.ly/elZJRJ : Montpellier Comedie Club - Avril 2011




More information about the Rcpp-devel mailing list