42 #ifndef TEUCHOS_RCP_DECL_HPP 43 #define TEUCHOS_RCP_DECL_HPP 52 #include "Teuchos_ENull.hpp" 53 #include "Teuchos_NullIteratorTraits.hpp" 56 #ifdef REFCOUNTPTR_INLINE_FUNCS 57 # define REFCOUNTPTR_INLINE inline 59 # define REFCOUNTPTR_INLINE 64 # define TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL 72 template<
class T>
class Ptr;
75 enum ERCPWeakNoDealloc { RCP_WEAK_NO_DEALLOC };
76 enum ERCPUndefinedWeakNoDealloc { RCP_UNDEFINED_WEAK_NO_DEALLOC };
77 enum ERCPUndefinedWithDealloc { RCP_UNDEFINED_WITH_DEALLOC };
502 template<
class Dealloc_T>
619 inline T*
get()
const;
783 #if defined(HAVE_TEUCHOSCORE_CXX11) && defined(HAVE_TEUCHOS_THREAD_SAFE) 785 inline RCP<T> create_strong_thread_safe()
const;
822 #ifdef TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL 859 TEUCHOS_DEPRECATED
inline int count()
const;
887 inline explicit RCP(T* p, ERCPWeakNoDealloc);
899 inline explicit RCP(T* p, ERCPUndefinedWeakNoDealloc);
907 template<
class Dealloc_T>
908 inline RCP(T* p, Dealloc_T dealloc, ERCPUndefinedWithDealloc,
911 #ifndef DOXYGEN_COMPILE 915 inline T* access_private_ptr()
const;
927 template<
class T1,
class T2>
inline 929 return p1.
get() < p2.
get();
937 template<
class T1,
class T2>
inline 939 return p1.
get() < p2.
get();
957 static RCP<T> getNull() {
return null; }
990 void free( T* ptr ) {
if(ptr)
delete ptr; }
1006 void free( T* ptr ) {
if(ptr)
delete [] ptr; }
1022 template<
class T,
class DeleteFunctor>
1028 void free( T* ptr ) {
if(ptr) deleteFunctor_(ptr); }
1030 DeleteFunctor deleteFunctor_;
1039 template<
class T,
class DeleteFunctor>
1060 template<
class T,
class DeleteHandleFunctor>
1065 : deleteHandleFunctor_(deleteHandleFunctor) {}
1067 void free( T* ptr ) {
if(ptr) { T **hdl = &ptr; deleteHandleFunctor_(hdl); } }
1069 DeleteHandleFunctor deleteHandleFunctor_;
1078 template<
class T,
class DeleteHandleFunctor>
1094 template<
class T,
class Embedded,
class Dealloc>
1098 typedef typename Dealloc::ptr_t ptr_t;
1102 ) : embedded_(embedded), prePostDestroy_(prePostDestroy), dealloc_(dealloc)
1104 void setObj(
const Embedded &embedded ) { embedded_ = embedded; }
1105 const Embedded& getObj()
const {
return embedded_; }
1106 Embedded& getNonconstObj() {
return embedded_; }
1109 if (prePostDestroy_ == PRE_DESTROY)
1110 embedded_ = Embedded();
1112 if (prePostDestroy_ == POST_DESTROY)
1113 embedded_ = Embedded();
1127 template<
class T,
class Embedded >
1140 template<
class T,
class Embedded >
1171 template<
class T>
inline 1218 template<
class T,
class Dealloc_T>
inline 1219 RCP<T> rcpWithDealloc(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1223 template<
class T,
class Dealloc_T>
inline 1224 TEUCHOS_DEPRECATED
RCP<T> rcp( T* p, Dealloc_T dealloc,
bool owns_mem )
1226 return rcpWithDealloc(p, dealloc, owns_mem);
1241 template<
class T,
class Dealloc_T>
inline 1242 RCP<T> rcpWithDeallocUndef(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1254 template<
class T>
inline 1255 RCP<T> rcpFromRef(T& r);
1267 template<
class T>
inline 1268 RCP<T> rcpFromUndefRef(T& r);
1281 template<
class T,
class Embedded>
inline 1283 rcpWithEmbeddedObjPreDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1296 template<
class T,
class Embedded>
inline 1298 rcpWithEmbeddedObjPostDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1312 template<
class T,
class Embedded>
inline 1314 rcpWithEmbeddedObj( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1331 template<
class T,
class ParentT>
1332 RCP<T> rcpWithInvertedObjOwnership(
const RCP<T> &child,
const RCP<ParentT> &parent);
1349 RCP<T> rcpCloneNode(
const RCP<T> &p);
1356 template<
class T>
inline 1357 bool is_null(
const RCP<T> &p );
1364 template<
class T>
inline 1365 bool nonnull(
const RCP<T> &p );
1372 template<
class T>
inline 1373 bool operator==(
const RCP<T> &p, ENull );
1380 template<
class T>
inline 1381 bool operator!=(
const RCP<T> &p, ENull );
1389 template<
class T1,
class T2>
inline 1390 bool operator==(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1398 template<
class T1,
class T2>
inline 1399 bool operator!=(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1411 template<
class T2,
class T1>
inline 1412 RCP<T2> rcp_implicit_cast(
const RCP<T1>& p1);
1425 template<
class T2,
class T1>
inline 1426 RCP<T2> rcp_static_cast(
const RCP<T1>& p1);
1435 template<
class T2,
class T1>
inline 1436 RCP<T2> rcp_const_cast(
const RCP<T1>& p1);
1462 template<
class T2,
class T1>
inline 1463 RCP<T2> rcp_dynamic_cast(
1464 const RCP<T1>& p1,
bool throw_on_fail =
false 1526 template<
class T1,
class T2>
1527 void set_extra_data(
const T1 &extra_data,
const std::string& name,
1529 bool force_unique =
true);
1550 template<
class T1,
class T2>
1551 const T1& get_extra_data(
const RCP<T2>& p,
const std::string& name );
1573 template<
class T1,
class T2>
1574 T1& get_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1601 template<
class T1,
class T2>
1602 Ptr<const T1> get_optional_extra_data(
const RCP<T2>& p,
const std::string& name );
1629 template<
class T1,
class T2>
1630 Ptr<T1> get_optional_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1644 template<
class Dealloc_T,
class T>
1645 const Dealloc_T& get_dealloc(
const RCP<T>& p );
1659 template<
class Dealloc_T,
class T>
1660 Dealloc_T& get_nonconst_dealloc(
const RCP<T>& p );
1677 template<
class Dealloc_T,
class T>
1678 Ptr<const Dealloc_T> get_optional_dealloc(
const RCP<T>& p );
1695 template<
class Dealloc_T,
class T>
1696 Ptr<Dealloc_T> get_optional_nonconst_dealloc(
const RCP<T>& p );
1705 template<
class TOrig,
class Embedded,
class T>
1706 const Embedded& getEmbeddedObj(
const RCP<T>& p );
1715 template<
class TOrig,
class Embedded,
class T>
1716 Embedded& getNonconstEmbeddedObj(
const RCP<T>& p );
1725 template<
class TOrig,
class Embedded,
class T>
1726 Ptr<const Embedded> getOptionalEmbeddedObj(
const RCP<T>& p );
1735 template<
class TOrig,
class Embedded,
class T>
1736 Ptr<Embedded> getOptionalNonconstEmbeddedObj(
const RCP<T>& p );
1744 template<
class ParentT,
class T>
1756 std::ostream& operator<<( std::ostream& out, const RCP<T>& p );
1762 #endif // TEUCHOS_RCP_DECL_HPP const RCP< T > & assert_valid_ptr() const
If the object pointer is non-null, assert that it is still valid.
~RCP()
Removes a reference to a dynamically allocated object and possibly deletes the object if owned...
RCP(ENull null_arg=null)
Initialize RCP<T> to NULL.
int strong_count() const
Return the number of active RCP<> objects that have a "strong" reference to the underlying reference-...
DeallocFunctorHandleDelete< T, DeleteHandleFunctor > deallocFunctorHandleDelete(DeleteHandleFunctor deleteHandleFunctor)
A simple function used to create a functor deallocator object.
void free(T *ptr)
Deallocates a pointer ptr using delete ptr (required).
T ptr_t
Gives the type (required)
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
Deallocator subclass that Allows any functor object (including a function pointer) to be used to free...
bool is_null(const std::shared_ptr< T > &p)
Returns true if p.get()==NULL.
int total_count() const
Total count (strong_count() + weak_count()).
const RCP< T > & debug_assert_not_null() const
Calls assert_not_null() in a debug build.
RCP< T > create_strong() const
Create a new strong RCP object from another (weak) RCP object.
TEUCHOS_DEPRECATED int count() const
Returns strong_count() [deprecated].
int weak_count() const
Return the number of active RCP<> objects that have a "weak" reference to the underlying reference-co...
void swap(RCP< T > &r_ptr)
Swap the contents with some other RCP object.
ERCPStrength strength() const
Strength of the pointer.
bool is_valid_ptr() const
Return if the underlying object pointer is still valid or not.
T & operator*() const
Dereference the underlying object.
ENull
Used to initialize a RCP object to NULL using an implicit conversion!
A deallocator class that wraps a simple value object and delegates to another deallocator object...
bool operator()(const RCP< T1 > p1, const RCP< T2 > p2) const
T * get() const
Get the raw C++ pointer to the underlying object.
Struct for comparing two RCPs. Simply compares the raw pointers contained within the RCPs...
void free(T *ptr)
Deallocates a pointer ptr using delete ptr (required).
bool shares_resource(const RCP< T2 > &r_ptr) const
Returns true if the smart pointers share the same underlying reference-counted object.
bool is_null() const
Returns true if the underlying pointer is null.
Struct for comparing two RCPs. Simply compares the raw pointers contained within the RCPs...
Policy class for deallocator that uses delete to delete a pointer which is used by RCP...
EmbeddedObjDealloc< T, Embedded, DeallocArrayDelete< T > > embeddedObjDeallocArrayDelete(const Embedded &embedded, EPrePostDestruction prePostDestroy)
Create a dealocator with an embedded object using delete [].
T * operator->() const
Pointer (->) access to members of underlying object.
const RCP< T > & debug_assert_valid_ptr() const
Calls assert_valid_ptr() in a debug build.
Deallocator class that uses delete [] to delete memory allocated uisng new []
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
void set_has_ownership()
Give this and other RCP<> objects ownership of the referenced object this->get(). ...
void reset()
Reset to null.
T ptr_t
Gives the type (required)
ERCPStrength
Used to specify if the pointer is weak or strong.
RCP< T > & operator=(const RCP< T > &r_ptr)
Copy the pointer to the referenced object and increment the reference count.
RCP< T > create_weak() const
Create a new weak RCP object from another (strong) RCP object.
Base traits class for getting a properly initialized null pointer.
Ptr< T > release()
Release the ownership of the underlying dynamically allocated object.
T ptr_t
Gives the type (required)
EmbeddedObjDealloc< T, Embedded, DeallocDelete< T > > embeddedObjDeallocDelete(const Embedded &embedded, EPrePostDestruction prePostDestroy)
Create a dealocator with an embedded object using delete.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos, as well as a number of utility routines.
bool has_ownership() const
Returns true if this has ownership of object pointed to by this->get() in order to delete it...
Handle class that manages the RCPNode's reference counting.
RCP< ParentT > getInvertedObjOwnershipParent(const RCP< T > &invertedChild)
Get the parent back from an inverted ownership RCP.
EPrePostDestruction
Used to specify a pre or post destruction of extra data.
T * getRawPtr() const
Get the raw C++ pointer to the underlying object.
Policy class for deallocator for non-owned RCPs.
Deallocator subclass that Allows any functor object (including a function pointer) to be used to free...
DeallocFunctorDelete< T, DeleteFunctor > deallocFunctorDelete(DeleteFunctor deleteFunctor)
A simple function used to create a functor deallocator object.
Smart reference counting pointer class for automatic garbage collection.
Ptr< T > operator()() const
Shorthand for ptr().
const RCP< T > & assert_not_null() const
Throws NullReferenceError if this->get()==NULL, otherwise returns reference to *this.
RCP< const T > getConst() const
Return an RCP<const T> version of *this.
Reference-counted pointer node classes.
void free(T *ptr)
Deallocates a pointer ptr using delete [] ptr (required).
Ptr< T > ptr() const
Get a safer wrapper raw C++ pointer to the underlying object.
Simple wrapper class for raw pointers to single objects where no persisting relationship exists...
bool operator()(const RCP< const T1 > p1, const RCP< const T2 > p2) const