[Rcpp-devel] wrapping clone() via Rcpp module -- solution

Dirk Eddelbuettel edd at debian.org
Wed Nov 16 07:32:57 CET 2011


On 16 November 2011 at 02:05, Tama Ma wrote:
| Dear Rcpp developers,
| 
| 1)	Here, I give my first attempt to solve this problem -- it is ugly but that works at least. (refer to below)

Nice work.  My first suspicion also was to try a name different from
'clone'.  But I was on a plane the last few hours and real busy at work
before that do no time to test things...

I also want to say looking at Boost::Python is the right idea. Well done.

| 2)	Let me try to add the clone() function into the Rcpp Module...
| 3)	I still prefer the copy constructor solution.
| 
| 	I am sorry for the delay, as digging into the source code with no
|       little documentation really takes some time.

And pretty advanced code as well. Keep the bottle of aspirin nearby ;-)

Dirk

| 
| 	Any suggestion is welcome.
| 
| Best regards,
| Tama Ma
| 
| 
| 
| <dummy.hpp>
| ===========
| #include <iostream>
| #include <Rcpp.h>
| 
| class dummy
| {
| public:
|   ~dummy() {}
|   dummy()  {}
|   dummy(double a_)          : _a(a_)       {}
|   dummy(const dummy& obj_)  : _a(obj_._a)  {}
| 
|   SEXP Rcpp_clone() const { return Rcpp::internal::make_new_object<dummy>(new dummy(*this)); }
| 
|   double a()  const  { return _a; }
| 
| private:
|   double _a;
| };
| 
| 
| <dummy.C>
| =========
| #include <Rcpp.h>
| #include "dummy.hpp"
| 
| 
| RCPP_MODULE(tamama)
| {
|   Rcpp::class_<dummy>("dummy")
|     .default_constructor()
|     .constructor<double>()
|     .method( "clone" , &dummy::Rcpp_clone  )
| 
|     .method( "a"     , &dummy::a      )
|     ;
| }
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| On Nov 15, 2011, at 10:17 PM, Tama Ma wrote:
| 
| > Dear Rcpp developers,
| > 
| > 	As I venture on, I find that the wrapping of clone() function couldn't be wrapped. However, the same can be done in boost python. May I know how I could help fixing this bug? The following is the error log:
| > 
| > 
| > Error log
| > ====================
| > g++ -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64 -I/opt/local/share/R-packages/Rcpp-0.9.7/inst/include -dynamiclib -o ./dummy.so ./dummy.C -L/opt/local/lib/R/lib/x86_64 -lR -lRblas -lRlapack -L/opt/local/share/R-packages/Rcpp-0.9.7/inst/lib/x86_64 -lRcpp
| > In file included from /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/RcppCommon.h:313,
| >                 from /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp.h:27,
| >                 from ./dummy.C:1:
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h: In function 'SEXPREC* Rcpp::internal::wrap_dispatch_unknown_iterable(const T&, Rcpp::traits::false_type) [with T = dummy]':
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:638:   instantiated from 'SEXPREC* Rcpp::internal::wrap_dispatch_unknown(const T&, Rcpp::traits::false_type) [with T = dummy]'
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:654:   instantiated from 'SEXPREC* Rcpp::internal::wrap_dispatch_eigen(const T&, Rcpp::traits::false_type) [with T = dummy]'
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:669:   instantiated from 'SEXPREC* Rcpp::internal::wrap_dispatch_unknown_importable(const T&, Rcpp::traits::false_type) [with T = dummy]'
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:687:   instantiated from 'SEXPREC* Rcpp::internal::wrap_dispatch(const T&, Rcpp::traits::wrap_type_unknown_tag) [with T = dummy]'
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:791:   instantiated from 'SEXPREC* Rcpp::wrap(const T&) [with T = dummy]'
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/module/Module_generated_CppMethod.h:88:   instantiated from 'SEXPREC* Rcpp::const_CppMethod0<Class, OUT>::operator()(Class*, SEXPREC**) [with Class = dummy, OUT = dummy]'
| > ./dummy.C:14:   instantiated from here
| > /opt/local/share/R-packages/Rcpp-0.9.7/inst/include/Rcpp/internal/wrap.h:433: error: cannot convert 'const dummy' to 'SEXPREC*' in initialization
| > make: *** [dummy.so] Error 1
| > dhcp-192-033-102-240:Rcpp_clone tamama$ 
| > 
| > 
| > <dummy.hpp>
| > ===================
| > #include <iostream>
| > 
| > class dummy
| > {
| > public:
| >  ~dummy() {}
| >  dummy()  {}
| >  dummy(double a_)          : _a(a_)       {}
| >  dummy(const dummy& obj_)  : _a(obj_._a)  {}
| > 
| >  dummy clone() const  { return dummy(*this); }
| > 
| >  double a()  const  { return _a; }
| > 
| > private:
| >  double _a;
| > };
| > 
| > 
| > <dummy.C>
| > ======================
| > #include <Rcpp.h>
| > #include "dummy.hpp"
| > 
| > 
| > RCPP_MODULE(tamama)
| > {
| >  Rcpp::class_<dummy>("dummy")
| >    .default_constructor()
| >    .constructor<double>()
| > 
| >    .method( "clone" , &dummy::clone  )
| >    .method( "a"     , &dummy::a      )
| >    ;
| > }
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > 
| > Best regards,
| > Tama Ma 
| > (+41 78 640 50 15)
| > 
| > pingnang at phys.ethz.ch
| > www.phys.ethz.ch/~pingnang
| > 
| > HIT K 31.3
| > Institut für Theoretische Physik
| > Wolfgang-Pauli-Strasse 27
| > ETH Hönggerberg
| > 8093 Zürich
| > Switzerland
| > 
| > _______________________________________________
| > Rcpp-devel mailing list
| > Rcpp-devel at lists.r-forge.r-project.org
| > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
| > 
| 
| 
| Best regards,
| Tama Ma 
| (+41 78 640 50 15)
| 
| pingnang at phys.ethz.ch
| www.phys.ethz.ch/~pingnang
| 
| HIT K 31.3
| Institut für Theoretische Physik
| Wolfgang-Pauli-Strasse 27
| ETH Hönggerberg
| 8093 Zürich
| Switzerland
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

-- 
"Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
dark to read." -- Groucho Marx


More information about the Rcpp-devel mailing list