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_OWNING_PTR_H
00015 #define LLVM_ADT_OWNING_PTR_H
00016 
00017 #include <cassert>
00018 #include <cstddef>
00019 
00020 namespace llvm {
00021 
00022 /// OwningPtr smart pointer - OwningPtr mimics a built-in pointer except that it
00023 /// guarantees deletion of the object pointed to, either on destruction of the
00024 /// OwningPtr or via an explicit reset().  Once created, ownership of the
00025 /// pointee object can be taken away from OwningPtr by using the take method.
00026 template<class T>
00027 class OwningPtr {
00028   OwningPtr(OwningPtr const &);             // DO NOT IMPLEMENT
00029   OwningPtr &operator=(OwningPtr const &); // DO NOT IMPLEMENT
00030   T *Ptr;
00031 public:
00032   explicit OwningPtr(T *P = 0) : Ptr(P) {}
00033 
00034   ~OwningPtr() {
00035     delete Ptr;
00036   }
00037 
00038   /// reset - Change the current pointee to the specified pointer.  Note that
00039   /// calling this with any pointer (including a null pointer) deletes the
00040   /// current pointer.
00041   void reset(T *P = 0) {
00042     if (P == Ptr) return;
00043     T *Tmp = Ptr;
00044     Ptr = P;
00045     delete Tmp;
00046   }
00047 
00048   /// take - Reset the owning pointer to null and return its pointer.  This does
00049   /// not delete the pointer before returning it.
00050   T *take() {
00051     T *Tmp = Ptr;
00052     Ptr = 0;
00053     return Tmp;
00054   }
00055 
00056   T &operator*() const {
00057     assert(Ptr && "Cannot dereference null pointer");
00058     return *Ptr;
00059   }
00060 
00061   T *operator->() const { return Ptr; }
00062   T *get() const { return Ptr; }
00063   operator bool() const { return Ptr != 0; }
00064   bool operator!() const { return Ptr == 0; }
00065 
00066   void swap(OwningPtr &RHS) {
00067     T *Tmp = RHS.Ptr;
00068     RHS.Ptr = Ptr;
00069     Ptr = Tmp;
00070   }
00071 };
00072 
00073 template<class T>
00074 inline void swap(OwningPtr<T> &a, OwningPtr<T> &b) {
00075   a.swap(b);
00076 }
00077 
00078 /// OwningArrayPtr smart pointer - OwningArrayPtr provides the same
00079 ///  functionality as OwningPtr, except that it works for array types.
00080 template<class T>
00081 class OwningArrayPtr {
00082   OwningArrayPtr(OwningArrayPtr const &);            // DO NOT IMPLEMENT
00083   OwningArrayPtr &operator=(OwningArrayPtr const &); // DO NOT IMPLEMENT
00084   T *Ptr;
00085 public:
00086   explicit OwningArrayPtr(T *P = 0) : Ptr(P) {}
00087 
00088   ~OwningArrayPtr() {
00089     delete [] Ptr;
00090   }
00091 
00092   /// reset - Change the current pointee to the specified pointer.  Note that
00093   /// calling this with any pointer (including a null pointer) deletes the
00094   /// current pointer.
00095   void reset(T *P = 0) {
00096     if (P == Ptr) return;
00097     T *Tmp = Ptr;
00098     Ptr = P;
00099     delete [] Tmp;
00100   }
00101 
00102   /// take - Reset the owning pointer to null and return its pointer.  This does
00103   /// not delete the pointer before returning it.
00104   T *take() {
00105     T *Tmp = Ptr;
00106     Ptr = 0;
00107     return Tmp;
00108   }
00109 
00110   T &operator[](std::ptrdiff_t i) const {
00111     assert(Ptr && "Cannot dereference null pointer");
00112     return Ptr[i];
00113   }
00114 
00115   T *get() const { return Ptr; }
00116   operator bool() const { return Ptr != 0; }
00117   bool operator!() const { return Ptr == 0; }
00118 
00119   void swap(OwningArrayPtr &RHS) {
00120     T *Tmp = RHS.Ptr;
00121     RHS.Ptr = Ptr;
00122     Ptr = Tmp;
00123   }
00124 };
00125 
00126 template<class T>
00127 inline void swap(OwningArrayPtr<T> &a, OwningArrayPtr<T> &b) {
00128   a.swap(b);
00129 }
00130 
00131 
00132 } // end namespace llvm
00133 
00134 #endif