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;
817 #ifdef TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL 854 TEUCHOS_DEPRECATED
inline int count()
const;
882 inline explicit RCP(T* p, ERCPWeakNoDealloc);
894 inline explicit RCP(T* p, ERCPUndefinedWeakNoDealloc);
902 template<
class Dealloc_T>
903 inline RCP(T* p, Dealloc_T dealloc, ERCPUndefinedWithDealloc,
906 #ifndef DOXYGEN_COMPILE 910 inline T* access_private_ptr()
const;
922 template<
class T1,
class T2>
inline 924 return p1.
get() < p2.
get();
932 template<
class T1,
class T2>
inline 934 return p1.
get() < p2.
get();
952 static RCP<T> getNull() {
return null; }
985 void free( T* ptr ) {
if(ptr)
delete ptr; }
1001 void free( T* ptr ) {
if(ptr)
delete [] ptr; }
1017 template<
class T,
class DeleteFunctor>
1023 void free( T* ptr ) {
if(ptr) deleteFunctor_(ptr); }
1025 DeleteFunctor deleteFunctor_;
1034 template<
class T,
class DeleteFunctor>
1055 template<
class T,
class DeleteHandleFunctor>
1060 : deleteHandleFunctor_(deleteHandleFunctor) {}
1062 void free( T* ptr ) {
if(ptr) { T **hdl = &ptr; deleteHandleFunctor_(hdl); } }
1064 DeleteHandleFunctor deleteHandleFunctor_;
1073 template<
class T,
class DeleteHandleFunctor>
1089 template<
class T,
class Embedded,
class Dealloc>
1093 typedef typename Dealloc::ptr_t ptr_t;
1097 ) : embedded_(embedded), prePostDestroy_(prePostDestroy), dealloc_(dealloc)
1099 void setObj(
const Embedded &embedded ) { embedded_ = embedded; }
1100 const Embedded& getObj()
const {
return embedded_; }
1101 Embedded& getNonconstObj() {
return embedded_; }
1104 if (prePostDestroy_ == PRE_DESTROY)
1105 embedded_ = Embedded();
1107 if (prePostDestroy_ == POST_DESTROY)
1108 embedded_ = Embedded();
1122 template<
class T,
class Embedded >
1135 template<
class T,
class Embedded >
1166 template<
class T>
inline 1213 template<
class T,
class Dealloc_T>
inline 1214 RCP<T> rcpWithDealloc(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1218 template<
class T,
class Dealloc_T>
inline 1219 TEUCHOS_DEPRECATED
RCP<T> rcp( T* p, Dealloc_T dealloc,
bool owns_mem )
1221 return rcpWithDealloc(p, dealloc, owns_mem);
1236 template<
class T,
class Dealloc_T>
inline 1237 RCP<T> rcpWithDeallocUndef(T* p, Dealloc_T dealloc,
bool owns_mem=
true);
1249 template<
class T>
inline 1250 RCP<T> rcpFromRef(T& r);
1262 template<
class T>
inline 1263 RCP<T> rcpFromUndefRef(T& r);
1276 template<
class T,
class Embedded>
inline 1278 rcpWithEmbeddedObjPreDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1291 template<
class T,
class Embedded>
inline 1293 rcpWithEmbeddedObjPostDestroy( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1307 template<
class T,
class Embedded>
inline 1309 rcpWithEmbeddedObj( T* p,
const Embedded &embedded,
bool owns_mem =
true );
1326 template<
class T,
class ParentT>
1327 RCP<T> rcpWithInvertedObjOwnership(
const RCP<T> &child,
const RCP<ParentT> &parent);
1344 RCP<T> rcpCloneNode(
const RCP<T> &p);
1351 template<
class T>
inline 1352 bool is_null(
const RCP<T> &p );
1359 template<
class T>
inline 1360 bool nonnull(
const RCP<T> &p );
1367 template<
class T>
inline 1368 bool operator==(
const RCP<T> &p, ENull );
1375 template<
class T>
inline 1376 bool operator!=(
const RCP<T> &p, ENull );
1384 template<
class T1,
class T2>
inline 1385 bool operator==(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1393 template<
class T1,
class T2>
inline 1394 bool operator!=(
const RCP<T1> &p1,
const RCP<T2> &p2 );
1406 template<
class T2,
class T1>
inline 1407 RCP<T2> rcp_implicit_cast(
const RCP<T1>& p1);
1420 template<
class T2,
class T1>
inline 1421 RCP<T2> rcp_static_cast(
const RCP<T1>& p1);
1430 template<
class T2,
class T1>
inline 1431 RCP<T2> rcp_const_cast(
const RCP<T1>& p1);
1457 template<
class T2,
class T1>
inline 1458 RCP<T2> rcp_dynamic_cast(
1459 const RCP<T1>& p1,
bool throw_on_fail =
false 1521 template<
class T1,
class T2>
1522 void set_extra_data(
const T1 &extra_data,
const std::string& name,
1524 bool force_unique =
true);
1545 template<
class T1,
class T2>
1546 const T1& get_extra_data(
const RCP<T2>& p,
const std::string& name );
1568 template<
class T1,
class T2>
1569 T1& get_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1596 template<
class T1,
class T2>
1597 Ptr<const T1> get_optional_extra_data(
const RCP<T2>& p,
const std::string& name );
1624 template<
class T1,
class T2>
1625 Ptr<T1> get_optional_nonconst_extra_data( RCP<T2>& p,
const std::string& name );
1639 template<
class Dealloc_T,
class T>
1640 const Dealloc_T& get_dealloc(
const RCP<T>& p );
1654 template<
class Dealloc_T,
class T>
1655 Dealloc_T& get_nonconst_dealloc(
const RCP<T>& p );
1672 template<
class Dealloc_T,
class T>
1673 Ptr<const Dealloc_T> get_optional_dealloc(
const RCP<T>& p );
1690 template<
class Dealloc_T,
class T>
1691 Ptr<Dealloc_T> get_optional_nonconst_dealloc(
const RCP<T>& p );
1700 template<
class TOrig,
class Embedded,
class T>
1701 const Embedded& getEmbeddedObj(
const RCP<T>& p );
1710 template<
class TOrig,
class Embedded,
class T>
1711 Embedded& getNonconstEmbeddedObj(
const RCP<T>& p );
1720 template<
class TOrig,
class Embedded,
class T>
1721 Ptr<const Embedded> getOptionalEmbeddedObj(
const RCP<T>& p );
1730 template<
class TOrig,
class Embedded,
class T>
1731 Ptr<Embedded> getOptionalNonconstEmbeddedObj(
const RCP<T>& p );
1739 template<
class ParentT,
class T>
1751 std::ostream& operator<<( std::ostream& out, const RCP<T>& p );
1757 #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