summaryrefslogtreecommitdiff
path: root/include/llvm/ADT/IntrusiveRefCntPtr.h
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-02-26 21:44:24 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-02-26 21:44:24 +0000
commit95e78348f08fab152b2b03c516cc9f22ed60b8de (patch)
tree8a8761c0c4f1287f8b7ccc5fccddf692e11ba742 /include/llvm/ADT/IntrusiveRefCntPtr.h
parent74ab84c31ef64538a1b56e1f282e49303412ad17 (diff)
downloadllvm-95e78348f08fab152b2b03c516cc9f22ed60b8de.tar.gz
llvm-95e78348f08fab152b2b03c516cc9f22ed60b8de.tar.bz2
llvm-95e78348f08fab152b2b03c516cc9f22ed60b8de.tar.xz
Update per review. Patch by Mikhail Glushenkov!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47628 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/IntrusiveRefCntPtr.h')
-rw-r--r--include/llvm/ADT/IntrusiveRefCntPtr.h73
1 files changed, 17 insertions, 56 deletions
diff --git a/include/llvm/ADT/IntrusiveRefCntPtr.h b/include/llvm/ADT/IntrusiveRefCntPtr.h
index 1a27d6cfce..8804f2b20f 100644
--- a/include/llvm/ADT/IntrusiveRefCntPtr.h
+++ b/include/llvm/ADT/IntrusiveRefCntPtr.h
@@ -22,34 +22,13 @@
#define LLVM_ADT_INTRUSIVE_REF_CNT_PTR
#include <cassert>
-#include <cstddef>
#include "llvm/Support/Casting.h"
-// Forward declarations
-
namespace llvm {
- template <class T>
- class RefCountedBase;
template <class T>
- class RefCountedBaseVPTR;
-}
-
-template <class T>
-void IntrusivePtrAddRef(llvm::RefCountedBase<T>*);
-
-template <class T>
-void IntrusivePtrRelease(llvm::RefCountedBase<T>*);
-
-template <class T>
-void IntrusivePtrAddRef(llvm::RefCountedBaseVPTR<T>*);
-
-template <class T>
-void IntrusivePtrRelease(llvm::RefCountedBaseVPTR<T>*);
-
-
-namespace llvm {
+ class IntrusiveRefCntPtr;
//===----------------------------------------------------------------------===//
/// RefCountedBase - A generic base class for objects that wish to
@@ -74,16 +53,16 @@ namespace llvm {
if (--ref_cnt == 0) delete static_cast<Derived*>(this);
}
- friend void IntrusivePtrAddRef<Derived>(RefCountedBase<Derived>*);
- friend void IntrusivePtrRelease<Derived>(RefCountedBase<Derived>*);
+ friend class IntrusiveRefCntPtr<Derived>;
};
//===----------------------------------------------------------------------===//
/// RefCountedBaseVPTR - A class that has the same function as
/// RefCountedBase, but with a virtual destructor. Should be used
-/// instead of RefCountedBase for classes that have virtual
-/// destructors. Classes that inherit from RefCountedBaseVPTR can't
-/// be allocated on stack.
+/// instead of RefCountedBase for classes that already have virtual
+/// methods to enforce dynamic allocation via 'new'. Classes that
+/// inherit from RefCountedBaseVPTR can't be allocated on stack -
+/// attempting to do this will produce a compile error.
//===----------------------------------------------------------------------===//
template <class Derived>
class RefCountedBaseVPTR {
@@ -99,33 +78,9 @@ namespace llvm {
if (--ref_cnt == 0) delete this;
}
- friend void IntrusivePtrAddRef<Derived>(RefCountedBaseVPTR<Derived>*);
- friend void IntrusivePtrRelease<Derived>(RefCountedBaseVPTR<Derived>*);
+ friend class IntrusiveRefCntPtr<Derived>;
};
-}
-
-//===----------------------------------------------------------------------===//
-/// IntrusivePtrAddRef - A utility function used by IntrusiveRefCntPtr
-/// to increment the reference count of an RefCountedBase-derived object.
-//===----------------------------------------------------------------------===//
-template <class T>
-void IntrusivePtrAddRef(llvm::RefCountedBase<T>* O) {
- O->Retain();
-}
-
-//===----------------------------------------------------------------------===//
-/// IntrusivePtrRelease - The complement of IntrusivePtrAddRef;
-/// decrements the reference count of a RefCounted object.
-//===----------------------------------------------------------------------===//
-template <class T>
-void IntrusivePtrRelease(llvm::RefCountedBase<T>* O) {
- O->Release();
-}
-
-
-namespace llvm {
-
//===----------------------------------------------------------------------===//
/// IntrusiveRefCntPtr - A template class that implements a "smart pointer"
/// that assumes the wrapped object has a reference count associated
@@ -136,6 +91,12 @@ namespace llvm {
/// incremented and upon destruction of the smart pointer the
/// reference count is decremented. This class also safely handles
/// wrapping NULL pointers.
+///
+/// Reference counting is implemented via calls to
+/// Obj->Retain()/Obj->Release(). Release() is required to destroy
+/// the object when the reference count reaches zero. Inheriting from
+/// RefCountedBase/RefCountedBaseVPTR takes care of this
+/// automatically.
//===----------------------------------------------------------------------===//
template <typename T>
class IntrusiveRefCntPtr {
@@ -144,7 +105,7 @@ namespace llvm {
public:
typedef T element_type;
- explicit IntrusiveRefCntPtr() : Obj(NULL) {}
+ explicit IntrusiveRefCntPtr() : Obj(0) {}
explicit IntrusiveRefCntPtr(T* obj) : Obj(obj) {
retain();
@@ -181,7 +142,7 @@ namespace llvm {
typedef T * IntrusiveRefCntPtr::*unspecified_bool_type;
operator unspecified_bool_type() const {
- return Obj == NULL ? NULL : &IntrusiveRefCntPtr::getPtr;
+ return Obj == 0 ? 0 : &IntrusiveRefCntPtr::getPtr;
}
void swap(IntrusiveRefCntPtr& other) {
@@ -191,8 +152,8 @@ namespace llvm {
}
private:
- void retain() { if (Obj) IntrusivePtrAddRef(Obj); }
- void release() { if (Obj) IntrusivePtrRelease(Obj); }
+ void retain() { if (Obj) Obj->Retain(); }
+ void release() { if (Obj) Obj->Release(); }
void replace(T* S) {
this_type(S).swap(this);