[Rcpp-devel] Wrapping a c++ class with singleton using RCPP Module

Nikhil Garg nikhilgarg.gju at gmail.com
Thu Feb 22 07:36:51 CET 2024


Hi,

Thanks, Inaki, Dirk, and Matthew for the replies to my query. Thank you
Matthew for your code samples, they were very helpful in finding my way
through the problem.

I am trying to wrap some code from a library, though the code base is
rather large so I didn't want to paste that into the rcpp-devel mailing
list. I have uploaded a sample code to Git Hub. You can see it here (
https://github.com/nikhil003/testSingleton).

It is pretty much what Matthew had written down with slight modifications
to reflect my particular case. Hope this gives some idea of how I imagine
it should work. I am very new to Rcpp but I will be spending some time
learning it so that I can have a working knowledge of it.

Any suggestions or guidance is highly appreciated.

Regards,
Nikhil

On Thu, 22 Feb 2024 at 06:18, Matthew Supernaw - NOAA Federal <
matthew.supernaw at noaa.gov> wrote:

> Hi Nikhil,
>
> Here's an updated version that exposes a FooWrapper class in the module to
> the previous posted code. Hopefully this helps!
>
> class FooWrapper{
> public:
>   Foo* foo_m;
>   FooWrapper(){}
>
>
>   FooWrapper(const FooWrapper& other):foo_m(other.foo_m){
>
>   }
>
>   FooWrapper(Foo* foo):foo_m(foo){
>
>   }
>
>   void SayHello(){
>     Rcpp::Rcout << "From \"void SayHello()\" -> "<<(this->foo_m)<<" -> ";
>     Rcpp::Rcout << "hello from Foo.\n";
>   }
>
> };
>
>
>
> RCPP_EXPOSED_CLASS(FooWrapper)
>
>   FooWrapper GetSingleton(){
>     FooWrapper ret(Foo::GetSingleton());
>     Rcpp::Rcout<<"From \"Foo& GetSingleton()\" -> memory address for
> singleton is " <<ret.foo_m<<"\n";
>     return ret;
>   }
>
>
>
>
>
> RCPP_MODULE(foo) {
>   Rcpp::class_<FooWrapper>("Foo")
>   .constructor()
>   .method("SayHello", &FooWrapper::SayHello);
>   Rcpp::function("GetSingleton", &GetSingleton);
>
> }
>
> On Wed, Feb 21, 2024 at 10:51 AM Matthew Supernaw - NOAA Federal <
> matthew.supernaw at noaa.gov> wrote:
>
>> Looks like I posted too soon. I just noticed the memory address from the
>> "SayHello" function doesn't match.
>>
>> On Wed, Feb 21, 2024 at 10:47 AM Matthew Supernaw - NOAA Federal <
>> matthew.supernaw at noaa.gov> wrote:
>>
>>> Hi Nikhil,
>>> I'm not exactly sure what you are trying to do, but I hope this simple
>>> example is helpful.
>>> Thanks.
>>> Matthew
>>>
>>>
>>> #include <Rcpp.h>
>>> using namespace Rcpp;
>>>
>>>
>>> class Foo{
>>> public:
>>>   static Foo* singleton;
>>>
>>>   Foo(){
>>>   }
>>>
>>>   void SayHello(){
>>>     Rcpp::Rcout << "From \"void SayHello()\" -> "<<this<<" -> ";
>>>     Rcpp::Rcout << "hello from Foo.\n";
>>>   }
>>>
>>>   static Foo* GetSingleton(){
>>>
>>>     if(singleton == NULL){
>>>       Foo::singleton = new Foo();
>>>     }
>>>     Rcpp::Rcout<<"From \"static Foo* GetSingleton()\" -> memory address
>>> for singleton is " <<Foo::singleton<<"\n";
>>>     return Foo::singleton;
>>>   }
>>> };
>>>
>>> Foo* Foo::singleton = NULL;
>>>
>>> RCPP_EXPOSED_CLASS(Foo)
>>>
>>>   Foo& GetSingleton(){
>>>     Foo* foo_singleton = Foo::GetSingleton();
>>>     Rcpp::Rcout<<"From \"Foo& GetSingleton()\" -> memory address for
>>> singleton is " <<foo_singleton<<"\n";
>>>     return *foo_singleton;
>>>   }
>>>
>>> RCPP_MODULE(foo) {
>>>   Rcpp::class_<Foo>("Foo")
>>>   .constructor()
>>>   .method("SayHello", &Foo::SayHello);
>>>   Rcpp::function("GetSingleton", &GetSingleton);
>>>
>>> }
>>> //From R
>>> // library(singleton)
>>> // library(Rcpp)
>>> //
>>> // foo <- Rcpp::Module("foo", PACKAGE = "singleton")
>>> //
>>> // foo_singleton<-foo$GetSingleton()
>>> // foo_singleton$SayHello()
>>>
>>> // Output:
>>> // From "static Foo* GetSingleton()" -> memory address for singleton is
>>> 0x7fcdf9387590
>>> // From "Foo& GetSingleton()" -> memory address for singleton is
>>> 0x7fcdf9387590
>>> // From "void SayHello()" -> 0x7fcdf9392b60 -> hello from Foo.
>>>
>>> On Wed, Feb 21, 2024 at 1:34 AM Nikhil Garg <nikhilgarg.gju at gmail.com>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> I am looking for some advice or hoping someone can point me in the
>>>> right direction for wrapping a C++ class with singleton using Rcpp. I have
>>>> been using RCPP modules for some of this work but got stuck with a C++
>>>> object which returns a singleton.
>>>>
>>>> Here is the general structure of the object
>>>>
>>>> class Foo {
>>>>     public:
>>>>         Foo();
>>>>         ~Foo();
>>>>
>>>>         static Foo &getFoo();
>>>>         Foo(Foo const&) = delete;
>>>>         void operator=(Foo const&) = delete;
>>>> }
>>>>
>>>> Regards,
>>>> Nikhil
>>>> _______________________________________________
>>>> 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
>>>>
>>>
>>>
>>> --
>>> Matthew Supernaw
>>> *Scientific Software Developer*
>>> *National Oceanic and Atmospheric Administration*
>>> *Office Of Science and Technology*
>>> *NOAA Fisheries | *U.S. Department of Commerce
>>> Phone 248 - 396 - 7797
>>>
>>>
>>>
>>
>> --
>> Matthew Supernaw
>> *Scientific Software Developer*
>> *National Oceanic and Atmospheric Administration*
>> *Office Of Science and Technology*
>> *NOAA Fisheries | *U.S. Department of Commerce
>> Phone 248 - 396 - 7797
>>
>>
>>
>
> --
> Matthew Supernaw
> *Scientific Software Developer*
> *National Oceanic and Atmospheric Administration*
> *Office Of Science and Technology*
> *NOAA Fisheries | *U.S. Department of Commerce
> Phone 248 - 396 - 7797
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20240222/7562dbe3/attachment.htm>


More information about the Rcpp-devel mailing list