LLVM API Documentation
00001 //===- llvm/ADT/OwningPtr.h - Smart ptr that owns the pointee ---*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file defines and implements the OwningPtr class. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #ifndef LLVM_ADT_OWNINGPTR_H 00015 #define LLVM_ADT_OWNINGPTR_H 00016 00017 #include "llvm/Support/Compiler.h" 00018 #include <cassert> 00019 #include <cstddef> 00020 00021 namespace llvm { 00022 00023 /// OwningPtr smart pointer - OwningPtr mimics a built-in pointer except that it 00024 /// guarantees deletion of the object pointed to, either on destruction of the 00025 /// OwningPtr or via an explicit reset(). Once created, ownership of the 00026 /// pointee object can be taken away from OwningPtr by using the take method. 00027 template<class T> 00028 class OwningPtr { 00029 OwningPtr(OwningPtr const &) LLVM_DELETED_FUNCTION; 00030 OwningPtr &operator=(OwningPtr const &) LLVM_DELETED_FUNCTION; 00031 T *Ptr; 00032 public: 00033 explicit OwningPtr(T *P = 0) : Ptr(P) {} 00034 00035 #if LLVM_HAS_RVALUE_REFERENCES 00036 OwningPtr(OwningPtr &&Other) : Ptr(Other.take()) {} 00037 00038 OwningPtr &operator=(OwningPtr &&Other) { 00039 reset(Other.take()); 00040 return *this; 00041 } 00042 #endif 00043 00044 ~OwningPtr() { 00045 delete Ptr; 00046 } 00047 00048 /// reset - Change the current pointee to the specified pointer. Note that 00049 /// calling this with any pointer (including a null pointer) deletes the 00050 /// current pointer. 00051 void reset(T *P = 0) { 00052 if (P == Ptr) return; 00053 T *Tmp = Ptr; 00054 Ptr = P; 00055 delete Tmp; 00056 } 00057 00058 /// take - Reset the owning pointer to null and return its pointer. This does 00059 /// not delete the pointer before returning it. 00060 T *take() { 00061 T *Tmp = Ptr; 00062 Ptr = 0; 00063 return Tmp; 00064 } 00065 00066 T &operator*() const { 00067 assert(Ptr && "Cannot dereference null pointer"); 00068 return *Ptr; 00069 } 00070 00071 T *operator->() const { return Ptr; } 00072 T *get() const { return Ptr; } 00073 LLVM_EXPLICIT operator bool() const { return Ptr != 0; } 00074 bool operator!() const { return Ptr == 0; } 00075 bool isValid() const { return Ptr != 0; } 00076 00077 void swap(OwningPtr &RHS) { 00078 T *Tmp = RHS.Ptr; 00079 RHS.Ptr = Ptr; 00080 Ptr = Tmp; 00081 } 00082 }; 00083 00084 template<class T> 00085 inline void swap(OwningPtr<T> &a, OwningPtr<T> &b) { 00086 a.swap(b); 00087 } 00088 00089 /// OwningArrayPtr smart pointer - OwningArrayPtr provides the same 00090 /// functionality as OwningPtr, except that it works for array types. 00091 template<class T> 00092 class OwningArrayPtr { 00093 OwningArrayPtr(OwningArrayPtr const &) LLVM_DELETED_FUNCTION; 00094 OwningArrayPtr &operator=(OwningArrayPtr const &) LLVM_DELETED_FUNCTION; 00095 T *Ptr; 00096 public: 00097 explicit OwningArrayPtr(T *P = 0) : Ptr(P) {} 00098 00099 #if LLVM_HAS_RVALUE_REFERENCES 00100 OwningArrayPtr(OwningArrayPtr &&Other) : Ptr(Other.take()) {} 00101 00102 OwningArrayPtr &operator=(OwningArrayPtr &&Other) { 00103 reset(Other.take()); 00104 return *this; 00105 } 00106 #endif 00107 00108 ~OwningArrayPtr() { 00109 delete [] Ptr; 00110 } 00111 00112 /// reset - Change the current pointee to the specified pointer. Note that 00113 /// calling this with any pointer (including a null pointer) deletes the 00114 /// current pointer. 00115 void reset(T *P = 0) { 00116 if (P == Ptr) return; 00117 T *Tmp = Ptr; 00118 Ptr = P; 00119 delete [] Tmp; 00120 } 00121 00122 /// take - Reset the owning pointer to null and return its pointer. This does 00123 /// not delete the pointer before returning it. 00124 T *take() { 00125 T *Tmp = Ptr; 00126 Ptr = 0; 00127 return Tmp; 00128 } 00129 00130 T &operator[](std::ptrdiff_t i) const { 00131 assert(Ptr && "Cannot dereference null pointer"); 00132 return Ptr[i]; 00133 } 00134 00135 T *get() const { return Ptr; } 00136 LLVM_EXPLICIT operator bool() const { return Ptr != 0; } 00137 bool operator!() const { return Ptr == 0; } 00138 00139 void swap(OwningArrayPtr &RHS) { 00140 T *Tmp = RHS.Ptr; 00141 RHS.Ptr = Ptr; 00142 Ptr = Tmp; 00143 } 00144 }; 00145 00146 template<class T> 00147 inline void swap(OwningArrayPtr<T> &a, OwningArrayPtr<T> &b) { 00148 a.swap(b); 00149 } 00150 00151 } // end namespace llvm 00152 00153 #endif