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