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>
639 inline T*
get()
const;
654 inline explicit operator bool()
const;
804 #if defined(HAVE_TEUCHOSCORE_CXX11) && defined(HAVE_TEUCHOS_THREAD_SAFE) 806 inline RCP<T> create_strong_thread_safe()
const;
843 #ifdef TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL 905 inline explicit RCP(T* p, ERCPWeakNoDealloc);
917 inline explicit RCP(T* p, ERCPUndefinedWeakNoDealloc);
925 template<
class Dealloc_T>
926 inline RCP(T* p, Dealloc_T dealloc, ERCPUndefinedWithDealloc,
929 #ifndef DOXYGEN_COMPILE 933 inline T* access_private_ptr()
const;
945 template<
class T1,
class T2>
inline 947 return p1.
get() < p2.
get();
955 template<
class T1,
class T2>
inline 957 return p1.
get() < p2.
get();
975 static RCP<T> getNull() {
return null; }
1008 void free( T* ptr ) {
if(ptr)
delete ptr; }
1024 void free( T* ptr ) {
if(ptr)
delete [] ptr; }
1040 template<
class T,
class DeleteFunctor>
1046 void free( T* ptr ) {
if(ptr) deleteFunctor_(ptr); }
1048 DeleteFunctor deleteFunctor_;
1057 template<
class T,
class DeleteFunctor>
1078 template<
class T,
class DeleteHandleFunctor>
1083 : deleteHandleFunctor_(deleteHandleFunctor) {}
1085 void free( T* ptr ) {
if(ptr) { T **hdl = &ptr; deleteHandleFunctor_(hdl); } }
1087 DeleteHandleFunctor deleteHandleFunctor_;
1096 template<
class T,
class DeleteHandleFunctor>
1112 template<
class T,
class Embedded,
class Dealloc>
1116 typedef typename Dealloc::ptr_t ptr_t;
1120 ) : embedded_(embedded), prePostDestroy_(prePostDestroy), dealloc_(dealloc)
1122 void setObj(
const Embedded &embedded ) { embedded_ = embedded; }
1123 const Embedded& getObj()
const {
return embedded_; }
1124 Embedded& getNonconstObj() {
return embedded_; }
1127 if (prePostDestroy_ == PRE_DESTROY)
1128 embedded_ = Embedded();
1130 if (prePostDestroy_ == POST_DESTROY)
1131 embedded_ = Embedded();
1145 template<
class T,
class Embedded >
1158 template<
class T,
class Embedded >
1189 template<
class T>
inline 1236 template<
class T,
class Dealloc_T>
inline 1237 RCP<T> rcpWithDealloc(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1241 template<
class T,
class Dealloc_T>
inline 1242 TEUCHOS_DEPRECATED
RCP<T> rcp( T* p, Dealloc_T dealloc,
bool owns_mem )
1244 return rcpWithDealloc(p, dealloc, owns_mem);
1259 template<
class T,
class Dealloc_T>
inline 1260 RCP<T> rcpWithDeallocUndef(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1272 template<
class T>
inline 1273 RCP<T> rcpFromRef(T& r);
1285 template<
class T>
inline 1286 RCP<T> rcpFromUndefRef(T& r);
1299 template<
class T,
class Embedded>
inline 1301 rcpWithEmbeddedObjPreDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1314 template<
class T,
class Embedded>
inline 1316 rcpWithEmbeddedObjPostDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1330 template<
class T,
class Embedded>
inline 1332 rcpWithEmbeddedObj( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1349 template<
class T,
class ParentT>
1350 RCP<T> rcpWithInvertedObjOwnership(
const RCP<T> &child,
const RCP<ParentT> &parent);
1367 RCP<T> rcpCloneNode(
const RCP<T> &p);
1374 template<
class T>
inline 1375 bool is_null(
const RCP<T> &p );
1382 template<
class T>
inline 1383 bool nonnull(
const RCP<T> &p );
1390 template<
class T>
inline 1391 bool operator==(
const RCP<T> &p, ENull );
1398 template<
class T>
inline 1399 bool operator!=(
const RCP<T> &p, ENull );
1407 template<
class T1,
class T2>
inline 1408 bool operator==(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1416 template<
class T1,
class T2>
inline 1417 bool operator!=(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1429 template<
class T2,
class T1>
inline 1430 RCP<T2> rcp_implicit_cast(
const RCP<T1>& p1);
1443 template<
class T2,
class T1>
inline 1444 RCP<T2> rcp_static_cast(
const RCP<T1>& p1);
1453 template<
class T2,
class T1>
inline 1454 RCP<T2> rcp_const_cast(
const RCP<T1>& p1);
1480 template<
class T2,
class T1>
inline 1481 RCP<T2> rcp_dynamic_cast(
1482 const RCP<T1>& p1,
bool throw_on_fail =
false 1544 template<
class T1,
class T2>
1545 void set_extra_data(
const T1 &extra_data,
const std::string& name,
1547 bool force_unique =
true);
1568 template<
class T1,
class T2>
1569 const T1& get_extra_data(
const RCP<T2>& p,
const std::string& name );
1591 template<
class T1,
class T2>
1592 T1& get_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1619 template<
class T1,
class T2>
1620 Ptr<const T1> get_optional_extra_data(
const RCP<T2>& p,
const std::string& name );
1647 template<
class T1,
class T2>
1648 Ptr<T1> get_optional_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1662 template<
class Dealloc_T,
class T>
1663 const Dealloc_T& get_dealloc(
const RCP<T>& p );
1677 template<
class Dealloc_T,
class T>
1678 Dealloc_T& get_nonconst_dealloc(
const RCP<T>& p );
1695 template<
class Dealloc_T,
class T>
1696 Ptr<const Dealloc_T> get_optional_dealloc(
const RCP<T>& p );
1713 template<
class Dealloc_T,
class T>
1714 Ptr<Dealloc_T> get_optional_nonconst_dealloc(
const RCP<T>& p );
1723 template<
class TOrig,
class Embedded,
class T>
1724 const Embedded& getEmbeddedObj(
const RCP<T>& p );
1733 template<
class TOrig,
class Embedded,
class T>
1734 Embedded& getNonconstEmbeddedObj(
const RCP<T>& p );
1743 template<
class TOrig,
class Embedded,
class T>
1744 Ptr<const Embedded> getOptionalEmbeddedObj(
const RCP<T>& p );
1753 template<
class TOrig,
class Embedded,
class T>
1754 Ptr<Embedded> getOptionalNonconstEmbeddedObj(
const RCP<T>& p );
1762 template<
class ParentT,
class T>
1774 std::ostream& operator<<( std::ostream& out, const RCP<T>& p );
1780 #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.
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