Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_RCPDecl.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TEUCHOS_RCP_DECL_HPP
11#define TEUCHOS_RCP_DECL_HPP
12
13
19#include "Teuchos_RCPNode.hpp"
20#include "Teuchos_ENull.hpp"
21#include "Teuchos_NullIteratorTraits.hpp"
22
23
24#ifdef REFCOUNTPTR_INLINE_FUNCS
25# define REFCOUNTPTR_INLINE inline
26#else
27# define REFCOUNTPTR_INLINE
28#endif
29
30
31#ifdef TEUCHOS_DEBUG
32# define TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL
33#endif
34
35
36namespace Teuchos {
37
38
40template<class T> class Ptr;
41
42
43enum ERCPWeakNoDealloc { RCP_WEAK_NO_DEALLOC };
44enum ERCPUndefinedWeakNoDealloc { RCP_UNDEFINED_WEAK_NO_DEALLOC };
45enum ERCPUndefinedWithDealloc { RCP_UNDEFINED_WITH_DEALLOC };
46
47
396template<class T>
397class RCP {
398public:
399
402
405
427 inline RCP(ENull null_arg = null);
428
449 inline explicit RCP( T* p, bool has_ownership = true );
450
470 template<class Dealloc_T>
471 inline RCP(T* p, Dealloc_T dealloc, bool has_ownership);
472
490 inline RCP(const RCP<T>& r_ptr);
491
499 inline RCP(RCP<T>&& r_ptr);
500
514 template<class T2>
515 inline RCP(const RCP<T2>& r_ptr);
516
526 template<class T2>
527 inline RCP(const RCP<T2>& r_ptr, T* ptr);
528
540 inline ~RCP();
541
561 inline RCP<T>& operator=(const RCP<T>& r_ptr);
562
572 inline RCP<T>& operator=(RCP<T>&& r_ptr);
573
586 inline RCP<T>& operator=(ENull);
587
589 inline void swap(RCP<T> &r_ptr);
590
592
595
597 inline bool is_null() const;
598
605 inline T* operator->() const;
606
613 inline T& operator*() const;
614
619 inline T* get() const;
620
625 inline T* getRawPtr() const;
626
628 inline Ptr<T> ptr() const;
629
631 inline Ptr<T> operator()() const;
632
634 inline explicit operator bool() const;
635
637 inline RCP<const T> getConst() const;
638
640
643
653 inline ERCPStrength strength() const;
654
664 inline bool is_valid_ptr() const;
665
671 inline int strong_count() const;
672
678 inline int weak_count() const;
679
681 inline int total_count() const;
682
701 inline void set_has_ownership();
702
713 inline bool has_ownership() const;
714
746 inline Ptr<T> release();
747
764 inline RCP<T> create_weak() const;
765
782 inline RCP<T> create_strong() const;
783
784#if defined(HAVE_TEUCHOSCORE_CXX11) && defined(HAVE_TEUCHOS_THREAD_SAFE)
786 inline RCP<T> create_strong_thread_safe() const; // this format to be determined
787#endif
788
796 template<class T2>
797 inline bool shares_resource(const RCP<T2>& r_ptr) const;
798
800
803
807 inline const RCP<T>& assert_not_null() const;
808
818 inline const RCP<T>& assert_valid_ptr() const;
819
821 inline const RCP<T>& debug_assert_not_null() const
822 {
823#ifdef TEUCHOS_REFCOUNTPTR_ASSERT_NONNULL
825#endif
826 return *this;
827 }
828
830 inline const RCP<T>& debug_assert_valid_ptr() const
831 {
832#ifdef TEUCHOS_DEBUG
834#endif
835 return *this;
836 }
837
839
842
844 inline void reset();
845
856 template<class T2>
857 inline void reset(T2* p, bool has_ownership = true);
858
860
861private:
862
863 // //////////////////////////////////////////////////////////////
864 // Private data members
865
866 T *ptr_; // NULL if this pointer is null
867 RCPNodeHandle node_; // NULL if this pointer is null
868
869public: // Bad bad bad
870
871 // These constructors are put here because we don't want to confuse users
872 // who would otherwise see them.
873
885 inline explicit RCP(T* p, ERCPWeakNoDealloc);
886
897 inline explicit RCP(T* p, ERCPUndefinedWeakNoDealloc);
898
905 template<class Dealloc_T>
906 inline RCP(T* p, Dealloc_T dealloc, ERCPUndefinedWithDealloc,
907 bool has_ownership = true);
908
909#ifndef DOXYGEN_COMPILE
910
911 // WARNING: A general user should *never* call these functions!
912 inline RCP(T* p, const RCPNodeHandle &node);
913 inline T* access_private_ptr() const; // Does not throw
914 inline RCPNodeHandle& nonconst_access_private_node(); // Does not thorw
915 inline const RCPNodeHandle& access_private_node() const; // Does not thorw
916
917#endif
918
919};
920
923struct RCPComp {
925 template<class T1, class T2> inline
926 bool operator() (const RCP<T1> p1, const RCP<T2> p2) const{
927 return p1.get() < p2.get();
928 }
929};
930
935 template<class T1, class T2> inline
936 bool operator() (const RCP<const T1> p1, const RCP<const T2> p2) const{
937 return p1.get() < p2.get();
938 }
939};
940
941
942
943// 2008/09/22: rabartl: NOTE: I removed the TypeNameTraits<RCP<T> >
944// specialization since I want to be able to print the type name of an RCP
945// that does not have the type T fully defined!
946
947
952template<typename T>
954public:
955 static RCP<T> getNull() { return null; }
956};
957
958
963template<class T>
965{
966public:
968 typedef T ptr_t;
970 void free( T* ptr ) {
971 (void) ptr; // silence "unused parameter" compiler warning
972 }
973};
974
975
981template<class T>
983{
984public:
986 typedef T ptr_t;
988 void free( T* ptr ) { if(ptr) delete ptr; }
989};
990
991
997template<class T>
999{
1000public:
1002 typedef T ptr_t;
1004 void free( T* ptr ) { if(ptr) delete [] ptr; }
1005};
1006
1007
1020template<class T, class DeleteFunctor>
1022{
1023public:
1025 typedef T ptr_t;
1026 void free( T* ptr ) { if(ptr) deleteFunctor_(ptr); }
1027private:
1028 DeleteFunctor deleteFunctor_;
1029 DeallocFunctorDelete(); // Not defined and not to be called!
1030};
1031
1032
1037template<class T, class DeleteFunctor>
1043
1044
1058template<class T, class DeleteHandleFunctor>
1060{
1061public:
1063 : deleteHandleFunctor_(deleteHandleFunctor) {}
1064 typedef T ptr_t;
1065 void free( T* ptr ) { if(ptr) { T **hdl = &ptr; deleteHandleFunctor_(hdl); } }
1066private:
1067 DeleteHandleFunctor deleteHandleFunctor_;
1068 DeallocFunctorHandleDelete(); // Not defined and not to be called!
1069};
1070
1071
1076template<class T, class DeleteHandleFunctor>
1082
1083
1092template<class T, class Embedded, class Dealloc>
1094{
1095public:
1096 typedef typename Dealloc::ptr_t ptr_t;
1100 ) : embedded_(embedded), prePostDestroy_(prePostDestroy), dealloc_(dealloc)
1101 {}
1102 void setObj( const Embedded &embedded ) { embedded_ = embedded; }
1103 const Embedded& getObj() const { return embedded_; }
1104 Embedded& getNonconstObj() { return embedded_; }
1105 void free( T* ptr )
1106 {
1107 if (prePostDestroy_ == PRE_DESTROY)
1108 embedded_ = Embedded();
1109 dealloc_.free(ptr);
1110 if (prePostDestroy_ == POST_DESTROY)
1111 embedded_ = Embedded();
1112 }
1113private:
1114 Embedded embedded_;
1115 EPrePostDestruction prePostDestroy_;
1116 Dealloc dealloc_;
1117 EmbeddedObjDealloc(); // Not defined and not to be called!
1118};
1119
1120
1125template<class T, class Embedded >
1132
1133
1138template<class T, class Embedded >
1145
1146
1169template<class T> inline
1170RCP<T> rcp(T* p, bool owns_mem = true);
1171
1177template <typename T, typename ... Args>
1178inline auto make_rcp(Args&& ... args)
1179{
1180 return Teuchos::rcp(
1181 new T(std::forward<Args>(args)...)
1182 );
1183}
1184
1228template<class T, class Dealloc_T> inline
1230
1231
1233template<class T, class Dealloc_T> inline
1235{
1236 return rcpWithDealloc(p, dealloc, owns_mem);
1237}
1238
1239
1251template<class T, class Dealloc_T> inline
1253
1254
1264template<class T> inline
1266
1267
1277template<class T> inline
1279
1280
1291template<class T, class Embedded> inline
1292RCP<T>
1294
1295
1306template<class T, class Embedded> inline
1307RCP<T>
1309
1310
1322template<class T, class Embedded> inline
1323RCP<T>
1325
1326
1327// 2007/10/25: rabartl: ToDo: put in versions of
1328// rcpWithEmbedded[Pre,Post]DestoryWithDealloc(...) that also accept a general
1329// deallocator!
1330
1331
1341template<class T, class ParentT>
1343
1344
1358template<class T>
1360
1361
1366template<class T> inline
1367bool is_null( const RCP<T> &p );
1368
1369
1374template<class T> inline
1375bool nonnull( const RCP<T> &p );
1376
1377
1382template<class T> inline
1383bool operator==( const RCP<T> &p, ENull );
1384
1385
1390template<class T> inline
1391bool operator!=( const RCP<T> &p, ENull );
1392
1393
1399template<class T1, class T2> inline
1400bool operator==( const RCP<T1> &p1, const RCP<T2> &p2 );
1401
1402
1408template<class T1, class T2> inline
1409bool operator!=( const RCP<T1> &p1, const RCP<T2> &p2 );
1410
1411
1421template<class T2, class T1> inline
1423
1424
1435template<class T2, class T1> inline
1437
1438
1445template<class T2, class T1> inline
1447
1448
1472template<class T2, class T1> inline
1474 const RCP<T1>& p1, bool throw_on_fail = false
1475 );
1476
1477
1536template<class T1, class T2>
1537void set_extra_data( const T1 &extra_data, const std::string& name,
1538 const Ptr<RCP<T2> > &p, EPrePostDestruction destroy_when = POST_DESTROY,
1539 bool force_unique = true);
1540
1560template<class T1, class T2>
1561const T1& get_extra_data( const RCP<T2>& p, const std::string& name );
1562
1563
1583template<class T1, class T2>
1584T1& get_nonconst_extra_data( RCP<T2>& p, const std::string& name );
1585
1586
1611template<class T1, class T2>
1612Ptr<const T1> get_optional_extra_data( const RCP<T2>& p, const std::string& name );
1613
1614
1639template<class T1, class T2>
1641
1642
1654template<class Dealloc_T, class T>
1656
1657
1669template<class Dealloc_T, class T>
1671
1672
1687template<class Dealloc_T, class T>
1689
1690
1705template<class Dealloc_T, class T>
1707
1708
1715template<class TOrig, class Embedded, class T>
1717
1718
1725template<class TOrig, class Embedded, class T>
1727
1728
1735template<class TOrig, class Embedded, class T>
1737
1738
1745template<class TOrig, class Embedded, class T>
1747
1748
1754template<class ParentT, class T>
1756
1757
1765template<class T>
1766std::ostream& operator<<( std::ostream& out, const RCP<T>& p );
1767
1768
1769} // end namespace Teuchos
1770
1771
1772#endif // TEUCHOS_RCP_DECL_HPP
Reference-counted pointer node classes.
Deallocator class that uses delete [] to delete memory allocated uisng new []
T ptr_t
Gives the type (required)
void free(T *ptr)
Deallocates a pointer ptr using delete [] ptr (required).
Policy class for deallocator that uses delete to delete a pointer which is used by RCP.
T ptr_t
Gives the type (required)
void free(T *ptr)
Deallocates a pointer ptr using delete ptr (required).
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.
Deallocator subclass that Allows any functor object (including a function pointer) to be used to free...
DeallocFunctorHandleDelete< T, DeleteHandleFunctor > deallocFunctorHandleDelete(DeleteHandleFunctor deleteHandleFunctor)
A simple function used to create a functor deallocator object.
Policy class for deallocator for non-owned RCPs.
T ptr_t
Gives the type (required)
void free(T *ptr)
Deallocates a pointer ptr using delete ptr (required).
A deallocator class that wraps a simple value object and delegates to another deallocator object.
EmbeddedObjDealloc< T, Embedded, DeallocArrayDelete< T > > embeddedObjDeallocArrayDelete(const Embedded &embedded, EPrePostDestruction prePostDestroy)
Create a dealocator with an embedded object using delete [].
EmbeddedObjDealloc< T, Embedded, DeallocDelete< T > > embeddedObjDeallocDelete(const Embedded &embedded, EPrePostDestruction prePostDestroy)
Create a dealocator with an embedded object using delete.
Base traits class for getting a properly initialized null pointer.
Simple wrapper class for raw pointers to single objects where no persisting relationship exists.
Smart reference counting pointer class for automatic garbage collection.
RCP< const T > getConst() const
Return an RCP<const T> version of *this.
RCP< T > rcpWithEmbeddedObjPreDestroy(T *p, const Embedded &embedded, bool owns_mem=true)
Create an RCP with and also put in an embedded object.
RCP< T > create_weak() const
Create a new weak RCP object from another (strong) RCP object.
bool operator==(const RCP< T1 > &p1, const RCP< T2 > &p2)
Return true if two RCP objects point to the same referenced-counted object and have the same node.
RCP< T > rcpWithDealloc(T *p, Dealloc_T dealloc, bool owns_mem=true)
Initialize from a raw pointer with a deallocation policy.
bool is_null(const RCP< T > &p)
Returns true if p.get()==NULL.
RCP< T2 > rcp_dynamic_cast(const RCP< T1 > &p1, bool throw_on_fail=false)
Dynamic cast of underlying RCP type from T1* to T2*.
RCP< T > rcp(T *p, bool owns_mem=true)
Create a RCP object properly typed.
RCP< T2 > rcp_static_cast(const RCP< T1 > &p1)
Static cast of underlying RCP type from T1* to T2*.
Ptr< Embedded > getOptionalNonconstEmbeddedObj(const RCP< T > &p)
Get an optional Ptr to a non-const embedded object if it was set by calling rcpWithEmbeddedObjPreDest...
Ptr< T > release()
Release the ownership of the underlying dynamically allocated object.
void reset()
Reset to null.
void set_has_ownership()
Give this and other RCP<> objects ownership of the referenced object this->get().
~RCP()
Removes a reference to a dynamically allocated object and possibly deletes the object if owned.
const RCP< T > & assert_valid_ptr() const
If the object pointer is non-null, assert that it is still valid.
bool operator!=(const RCP< T > &p, ENull)
Returns true if p.get()!=NULL.
Ptr< Dealloc_T > get_optional_nonconst_dealloc(const RCP< T > &p)
Return a pointer to the underlying non-const deallocator object if it exists.
bool shares_resource(const RCP< T2 > &r_ptr) const
Returns true if the smart pointers share the same underlying reference-counted object.
RCP< T > rcpWithEmbeddedObj(T *p, const Embedded &embedded, bool owns_mem=true)
Create an RCP with and also put in an embedded object.
Embedded & getNonconstEmbeddedObj(const RCP< T > &p)
Get a non-const reference to an embedded object that was set by calling rcpWithEmbeddedObjPreDestroy(...
RCP< T2 > rcp_implicit_cast(const RCP< T1 > &p1)
Implicit cast of underlying RCP type from T1* to T2*.
const Dealloc_T & get_dealloc(const RCP< T > &p)
Return a const reference to the underlying deallocator object.
Dealloc_T & get_nonconst_dealloc(const RCP< T > &p)
Return a non-const reference to the underlying deallocator object.
void swap(RCP< T > &r_ptr)
Swap the contents with some other RCP object.
RCP< T2 > rcp_const_cast(const RCP< T1 > &p1)
Constant cast of underlying RCP type from T1* to T2*.
RCP< T > rcpWithDeallocUndef(T *p, Dealloc_T dealloc, bool owns_mem=true)
Initialize from a raw pointer with a deallocation policy for an undefined type.
RCP< T > rcpFromRef(T &r)
Return a non-owning weak RCP object from a raw object reference for a defined type.
Ptr< T1 > get_optional_nonconst_extra_data(RCP< T2 > &p, const std::string &name)
Get a pointer to non-const extra data (if it exists) associated with a RCP object.
bool is_null() const
Returns true if the underlying pointer is null.
RCP< T > rcpFromUndefRef(T &r)
Return a non-owning weak RCP object from a raw object reference for an undefined type.
RCP< T > rcpWithEmbeddedObjPostDestroy(T *p, const Embedded &embedded, bool owns_mem=true)
Create an RCP with and also put in an embedded object.
T * getRawPtr() const
Get the raw C++ pointer to the underlying object.
Ptr< T > ptr() const
Get a safer wrapper raw C++ pointer to the underlying object.
T1 & get_nonconst_extra_data(RCP< T2 > &p, const std::string &name)
Get a non-const reference to extra data associated with a RCP object.
const RCP< T > & assert_not_null() const
Throws NullReferenceError if this->get()==NULL, otherwise returns reference to *this.
const RCP< T > & debug_assert_valid_ptr() const
Calls assert_valid_ptr() in a debug build.
std::ostream & operator<<(std::ostream &out, const RCP< T > &p)
Output stream inserter.
Ptr< const T1 > get_optional_extra_data(const RCP< T2 > &p, const std::string &name)
Get a pointer to const extra data (if it exists) associated with a RCP object.
T * operator->() const
Pointer (->) access to members of underlying object.
bool is_valid_ptr() const
Return if the underlying object pointer is still valid or not.
const T1 & get_extra_data(const RCP< T2 > &p, const std::string &name)
Get a const reference to extra data associated with a RCP object.
RCP< T > create_strong() const
Create a new strong RCP object from another (weak) RCP object.
RCP< T > rcpWithInvertedObjOwnership(const RCP< T > &child, const RCP< ParentT > &parent)
Create a new RCP that inverts the ownership of parent and child.
Ptr< const Dealloc_T > get_optional_dealloc(const RCP< T > &p)
Return a pointer to the underlying const deallocator object if it exists.
bool has_ownership() const
Returns true if this has ownership of object pointed to by this->get() in order to delete it.
bool operator!=(const RCP< T1 > &p1, const RCP< T2 > &p2)
Return true if two RCP objects do not point to the same referenced-counted object and have the same n...
bool nonnull(const RCP< T > &p)
Returns true if p.get()!=NULL.
T * get() const
Get the raw C++ pointer to the underlying object.
ERCPStrength strength() const
Strength of the pointer.
void set_extra_data(const T1 &extra_data, const std::string &name, const Ptr< RCP< T2 > > &p, EPrePostDestruction destroy_when=POST_DESTROY, bool force_unique=true)
Set extra data associated with a RCP object.
RCP< T > rcpCloneNode(const RCP< T > &p)
Allocate a new RCP object with a new RCPNode with memory pointing to the initial node.
Ptr< const Embedded > getOptionalEmbeddedObj(const RCP< T > &p)
Get an optional Ptr to a const embedded object if it was set by calling rcpWithEmbeddedObjPreDestroy(...
int weak_count() const
Return the number of active RCP<> objects that have a "weak" reference to the underlying reference-co...
ENull
Used to initialize a RCP object to NULL using an implicit conversion!
const RCP< T > & debug_assert_not_null() const
Calls assert_not_null() in a debug build.
RCP< T > & operator=(const RCP< T > &r_ptr)
Copy the pointer to the referenced object and increment the reference count.
int total_count() const
Total count (strong_count() + weak_count()).
bool operator==(const RCP< T > &p, ENull)
Returns true if p.get()==NULL.
int strong_count() const
Return the number of active RCP<> objects that have a "strong" reference to the underlying reference-...
const Embedded & getEmbeddedObj(const RCP< T > &p)
Get a const reference to an embedded object that was set by calling rcpWithEmbeddedObjPreDestroy(),...
Ptr< T > operator()() const
Shorthand for ptr().
T & operator*() const
Dereference the underlying object.
Handle class that manages the RCPNode's reference counting.
ERCPStrength
Used to specify if the pointer is weak or strong.
EPrePostDestruction
Used to specify a pre or post destruction of extra data.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
auto make_rcp(Args &&... args)
RCP< ParentT > getInvertedObjOwnershipParent(const RCP< T > &invertedChild)
Get the parent back from an inverted ownership RCP.
Struct for comparing two RCPs. Simply compares the raw pointers contained within the RCPs.
bool operator()(const RCP< T1 > p1, const RCP< T2 > p2) const
Struct for comparing two RCPs. Simply compares the raw pointers contained within the RCPs.
bool operator()(const RCP< const T1 > p1, const RCP< const T2 > p2) const