Home | History | Annotate | Download | only in memory
      1 // Copyright 2014 The Android Open Source Project
      2 //
      3 // This software is licensed under the terms of the GNU General Public
      4 // License version 2, as published by the Free Software Foundation, and
      5 // may be copied, distributed, and modified under those terms.
      6 //
      7 // This program is distributed in the hope that it will be useful,
      8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 // GNU General Public License for more details.
     11 
     12 #ifndef ANDROID_BASE_MEMORY_SCOPED_PTR_H
     13 #define ANDROID_BASE_MEMORY_SCOPED_PTR_H
     14 
     15 #include "android/base/Compiler.h"
     16 
     17 #include <stddef.h>
     18 
     19 namespace android {
     20 namespace base {
     21 
     22 // Helper scoped pointer template class. Ensures that an object is
     23 // deleted at scope exit, unless its release() method has been called.
     24 // Usage example:
     25 //
     26 //    {
     27 //      ScopedPtr<Foo> ptr(new Foo());
     28 //      foo->DoStuff();
     29 //    }  // destroys the instance automatically.
     30 //
     31 // You cannot copy ScopedPtr instances directly, but you can actually
     32 // pass ownership from one instance to the other with the release()
     33 // method as in:
     34 //
     35 //     ScopedPtr<Foo> ptr(new Foo());         // object owned by |ptr|
     36 //     ScopedPtr<Foo> ptr2(ptr.release());    // object owned by |ptr2|
     37 //
     38 template <class T>
     39 class ScopedPtr {
     40 public:
     41     // Default constructor.
     42     ScopedPtr() : mPtr(NULL) {}
     43 
     44     // Normal constructor, takes ownership of |ptr|.
     45     explicit ScopedPtr(T* ptr) : mPtr(ptr) {}
     46 
     47     // Destructor will call reset() automatically.
     48     ~ScopedPtr() { reset(NULL); }
     49 
     50     // Release the pointer object from the instance and return it.
     51     // Caller should assume ownership of the object.
     52     T* release() {
     53         T* ptr = mPtr;
     54         mPtr = NULL;
     55         return ptr;
     56     }
     57 
     58     // Reset the managed object to a new value.
     59     void reset(T* ptr) {
     60         delete mPtr;
     61         mPtr = ptr;
     62     }
     63 
     64     // Return pointer of scoped object. Owernship is _not_
     65     // transferred to the caller.
     66     T* get() { return mPtr; }
     67 
     68     // Return a reference to the scoped object. Allows one to
     69     // write (*foo).DoStuff().
     70     T& operator*() { return *mPtr; }
     71 
     72     // Return a pointer to the scoped object. Allows one to write
     73     // foo->DoStuff().
     74     T* operator->() { return mPtr; }
     75 
     76 private:
     77     DISALLOW_COPY_AND_ASSIGN(ScopedPtr);
     78     T* mPtr;
     79 };
     80 
     81 }  // namespace base
     82 }  // namespace android
     83 
     84 #endif  // ANDROID_BASE_MEMORY_SCOPED_PTR_H
     85