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