[Trilinos-Users] boost/std::shared_ptr interoperability
Bartlett, Roscoe A.
bartlettra at ornl.gov
Thu Jan 30 08:50:38 MST 2014
That should work. However, the only issue is that if you convert from an RCP to a std::shared_ptr and then want to take that std::shared_ptr and convert back to an RCP (or visa versa), it would be nice if you got the original RCP and copy it instead of creating a new RCPNode object (and new reference count). That is what the existing RCP <-> boost::shared_ptr converts do I believe.
-Ross
From: Simone Pezzuto [mailto:junki.gnu at gmail.com]
Sent: Thursday, January 30, 2014 10:47 AM
To: Bartlett, Roscoe A.
Cc: Wojciech Smigaj; trilinos-users at software.sandia.gov
Subject: Re: [Trilinos-Users] boost/std::shared_ptr interoperability
Some time ago, after digging on stackoverflow, I came up with this solution:
#include <Teuchos_RCP.hpp>
#include <Teuchos_RCPBoostSharedPtrConversions.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <cstdlib>
// It creates T1<T> from T2<T>, in such a way that the deleter
// of T1<T> it's just a lambda function that holds a reference of T2
template<template <typename T> class T1, template <typename T> class T2, typename T>
T1<T> convert_to (const T2<T>& ptr)
{
return T1<T> (ptr.get(), [ptr](T*){});
}
int main(void)
{
// boost -> {std, Teuchos}
{
boost::shared_ptr<int> b_ptr(new int(20));
auto c_ptr = convert_to<std::shared_ptr>(b_ptr);
auto t_ptr = Teuchos::rcp(b_ptr);
}
// RCP -> {boost, std}
{
Teuchos::RCP<int> t_ptr(new int(20));
auto b_ptr = Teuchos::shared_pointer(t_ptr);
auto c_ptr = convert_to<std::shared_ptr>(t_ptr);
}
// std -> {boost, Teuchos}
{
std::shared_ptr<int> c_ptr(new int(20));
auto b_ptr = convert_to<boost::shared_ptr>(c_ptr);
// RCP doesn't support lambda functions, while boost::shared_ptr does
// because the deleter is templated
// auto t_ptr = convert_to<Teuchos::RCP>(c_ptr); // Not working!
// Not optimal workaround
auto t_ptr = Teuchos::rcp(convert_to<boost::shared_ptr>(s_ptr));
}
return EXIT_SUCCESS;
}
Is fundamental to have consistent internal counters of each smart pointer. The "conversion" simply overloads
the deleter with a do-nothing function, but such that it takes as argument a reference of the other smart pointer,
so that its internal counter is increased.
Cheers,
Simone
2014-01-30 Bartlett, Roscoe A. <bartlettra at ornl.gov<mailto:bartlettra at ornl.gov>>:
Nico and others,
You will want to copy the code for supporting the interoperability of Teuchos::RCP and boost::shared_ptr for use with std::shared_ptr I think.
I am currently on projects that don’t allow C++11 yet so you should expect little support for C++11 at this point. However, this might change in the next few months. At that point, I will update a bunch of this software to optionally take advantage of C++11 features and to provide interoperability with std::shared_ptr.
-Ross
P.S. I remember being a grad student being able to use bleeding edge compilers and approaches. Those were good days in many respects.
> -----Original Message-----
> From: trilinos-users-bounces at software.sandia.gov<mailto:trilinos-users-bounces at software.sandia.gov> [mailto:trilinos-users-<mailto:trilinos-users->
> bounces at software.sandia.gov<mailto:bounces at software.sandia.gov>] On Behalf Of Wojciech Smigaj
> Sent: Thursday, January 30, 2014 9:08 AM
> To: trilinos-users at software.sandia.gov<mailto:trilinos-users at software.sandia.gov>
> Subject: Re: [Trilinos-Users] boost/std::shared_ptr interoperability
>
> On 30/01/2014 13:12, Nico Schlömer wrote:
> > Hi all,
> >
> > is there any better way for creating an RCP from a
> boost/std::shared_ptr than
> >
> > Teuchos::rcp(myBoostPtr.get(), false))
> >
> > ?
> >
> > Cheers,
> > Nico
>
> Hi Nico,
>
> yes, there are dedicated functions for doing this; see here:
>
> http://trilinos.sandia.gov/packages/docs/r11.0/packages/teuchos/doc/html/
> group__Teuchos__RCPBoostSharedPtrConversions__grp.html
>
> Best regards,
> Wojciech
> _______________________________________________
> Trilinos-Users mailing list
> Trilinos-Users at software.sandia.gov<mailto:Trilinos-Users at software.sandia.gov>
> http://software.sandia.gov/mailman/listinfo/trilinos-users
_______________________________________________
Trilinos-Users mailing list
Trilinos-Users at software.sandia.gov<mailto:Trilinos-Users at software.sandia.gov>
http://software.sandia.gov/mailman/listinfo/trilinos-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://software.sandia.gov/pipermail/trilinos-users/attachments/20140130/776ab80d/attachment.html
More information about the Trilinos-Users
mailing list