[Rcpp-devel] How to Get Pointer of Underlying Object of Rcpp Module Class
Tianqi Chen
tianqi.tchen at gmail.com
Tue Oct 6 23:42:08 CEST 2015
Sorry about the in-complete message. I sent it earlier but did not get it
posted. The question is about how to Get XPtr out from underlying Rcpp S4
object, and how to construct such object from C++ side.
Tianqi
On Tue, Oct 6, 2015 at 2:40 PM, Tianqi Chen <tianqi.tchen at gmail.com> wrote:
> Dear Rcpp Developers:
>
> ```c++
> class MyClass {
> public:
> static void SaveList(SEXP list, const std::string& filename) {
> Rcpp::List data_lst(list);
> std::vector<MyClass *> internals(data_lst[i]);
> for (size_t i = 0; i < data_lst.size(); ++i) {
> SEXP obj = data_lst[i];
> // Need to Get internal pointers from S4 MyClass object
> internals[i] = GetPtr<MyClass>(obj);
> }
> SomeRealSave(internals, filename);
> }
> static void LoadList(const std::string& filename) {
> std::vector<MyClass > internals;
> SomeReadLoad(&internals);
> Rcpp::List out(internals.size());
> for (size_t i = 0; i < internals.size(); ++i) {
> // need to construct a MyClass object from C++ side
> out[i] = MyClassConstructor(internals[i]);
> }
> return out;
> }
> };
>
> RCPP_MODULE(MyClass) {
> class_<MyClass>("MyClass");
>
> function("save.myclass.list", &MyClass::SaveList);
> function("load.myclass.list", &MyClass::LoadList);
> }
> ```
>
> To be specific, We have ways to Save/Load the pointers to the MyClass
> object (in the SomeRealSave and SomeRealLoad). In our specific use-case, It
> was an Array on GPU.
>
> So the question is how is there any solution to GetPtr<MyClass> and MyClassConstructor,
> so we can get the internal pointer of MyClass from SEXP(which is the S4
> object), and construct the corresponding S4 object given the information of
> MyClass.
>
>
> What was wanted is indeed possible if we choose to only expose
> XPtr<MyClass>, so we can simply do
> ```
> MyClass * GetPtr<MyClass>(SEXP obj) {
> XPtr<MyClass>(obj).get();
> }
> MyClassConstructor(MyClass *ptr) {
> return XPtr<MyClass>(ptr);
> }
>
> ```
>
> But it would be really nice we can directly return a wrapped S4 object
> instead of raw ptr
>
> Tianqi
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20151006/a2fd142d/attachment-0001.html>
More information about the Rcpp-devel
mailing list