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