[Rcpp-devel] returning pointers in module methods
Romain Francois
romain at r-enthusiasts.com
Tue Jun 7 15:35:21 CEST 2011
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