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.
Handle class that manages the RCPNode's reference counting.
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.
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