|
Teuchos - Trilinos Tools Package Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Teuchos: Common Tools Package 00005 // Copyright (2004) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // This library is free software; you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as 00012 // published by the Free Software Foundation; either version 2.1 of the 00013 // License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, but 00016 // WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00023 // USA 00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00025 // 00026 // *********************************************************************** 00027 // @HEADER 00028 00029 #ifndef TEUCHOS_RCP_SHAREDPTR_CONVERSIONS_HPP 00030 #define TEUCHOS_RCP_SHAREDPTR_CONVERSIONS_HPP 00031 00032 #include "Teuchos_RCPBoostSharedPtrConversionsDecl.hpp" 00033 #include "Teuchos_RCP.hpp" 00034 00035 00036 template<class T> 00037 Teuchos::RCP<T> 00038 Teuchos::rcp( const boost::shared_ptr<T> &sptr ) 00039 { 00040 if (sptr.get()) { 00041 // First, see if the RCP is in the shared_ptr deleter object 00042 const RCPDeleter<T> 00043 *rcpd = boost::get_deleter<RCPDeleter<T> >(sptr); 00044 if (rcpd) { 00045 return rcpd->ptr(); 00046 } 00047 #ifdef TEUCHOS_DEBUG 00048 // Second, see if the an RCP node pointing to this type already exists 00049 // from being wrapped already from a prior call to this function where the 00050 // add_new_RCPNode(...) function could have been called already!. 00051 RCPNode* existingRCPNode = RCPNodeTracer::getExistingRCPNode(sptr.get()); 00052 if (existingRCPNode) { 00053 return RCP<T>(sptr.get(), RCPNodeHandle(existingRCPNode, RCP_STRONG, false)); 00054 } 00055 #endif 00056 // Lastly, we just create a new RCP and RCPNode ... 00057 return rcp(sptr.get(), DeallocBoostSharedPtr<T>(sptr), true); 00058 } 00059 return null; 00060 } 00061 00062 00063 template<class T> 00064 boost::shared_ptr<T> 00065 Teuchos::shared_pointer( const RCP<T> &rcp ) 00066 { 00067 if (nonnull(rcp)) { 00068 Ptr<const DeallocBoostSharedPtr<T> > 00069 dbsp = get_optional_dealloc<DeallocBoostSharedPtr<T> >(rcp); 00070 if (nonnull(dbsp)) 00071 return dbsp->ptr(); 00072 return boost::shared_ptr<T>(rcp.get(), RCPDeleter<T>(rcp)); 00073 } 00074 return boost::shared_ptr<T>(); 00075 } 00076 00077 00078 #endif // TEUCHOS_RCP_SHAREDPTR_CONVERSIONS_HPP
1.7.4