LLVM API Documentation

OwningPtr.h
Go to the documentation of this file.
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