1b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian/*
2b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * Copyright (C) 2005 The Android Open Source Project
3b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian *
4b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * you may not use this file except in compliance with the License.
6b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * You may obtain a copy of the License at
7b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian *
8b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian *
10b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * See the License for the specific language governing permissions and
14b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian * limitations under the License.
15b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian */
16b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
17b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#ifndef ANDROID_STRONG_POINTER_H
18b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#define ANDROID_STRONG_POINTER_H
19b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
20b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#include <cutils/atomic.h>
21b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
22b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#include <stdint.h>
23b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#include <sys/types.h>
24b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#include <stdlib.h>
25b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
26b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// ---------------------------------------------------------------------------
27b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiannamespace android {
28b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
29b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T> class wp;
30b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
31b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// ---------------------------------------------------------------------------
32b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
33b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#define COMPARE(_op_)                                           \
34b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const sp<T>& o) const {              \
35b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o.m_ptr;                                  \
36b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}                                                               \
37b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const T* o) const {                  \
38b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o;                                        \
39b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}                                                               \
40b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename U>                                            \
41b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const sp<U>& o) const {              \
42b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o.m_ptr;                                  \
43b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}                                                               \
44b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename U>                                            \
45b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const U* o) const {                  \
46b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o;                                        \
47b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}                                                               \
48b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const wp<T>& o) const {              \
49b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o.m_ptr;                                  \
50b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}                                                               \
51b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename U>                                            \
52b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianinline bool operator _op_ (const wp<U>& o) const {              \
53b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return m_ptr _op_ o.m_ptr;                                  \
54b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
55b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
56b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// ---------------------------------------------------------------------------
57b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
588db925f7777834eae5af386f7f92a22478c88346Mathias Agopiantemplate<typename T>
598db925f7777834eae5af386f7f92a22478c88346Mathias Agopianclass sp {
60b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianpublic:
61b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    inline sp() : m_ptr(0) { }
62b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
63b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    sp(T* other);
64b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    sp(const sp<T>& other);
65b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename U> sp(U* other);
66b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename U> sp(const sp<U>& other);
67b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
68b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    ~sp();
69b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
70b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    // Assignment
71b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
72b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    sp& operator = (T* other);
73b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    sp& operator = (const sp<T>& other);
74b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
75b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename U> sp& operator = (const sp<U>& other);
76b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename U> sp& operator = (U* other);
77b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
78b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    //! Special optimization for use by ProcessState (and nobody else).
79b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    void force_set(T* other);
80b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
81b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    // Reset
82b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
83b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    void clear();
84b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
85b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    // Accessors
86b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
87b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    inline  T&      operator* () const  { return *m_ptr; }
88b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    inline  T*      operator-> () const { return m_ptr;  }
89b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    inline  T*      get() const         { return m_ptr; }
90b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
91b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    // Operators
92b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
93b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(==)
94b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(!=)
95b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(>)
96b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(<)
97b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(<=)
98b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    COMPARE(>=)
99b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
100b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopianprivate:
101b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename Y> friend class sp;
102b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    template<typename Y> friend class wp;
1033e0f87541f7871ffde51c722d54550774fe1b7c3Mathias Agopian    void set_pointer(T* ptr);
1043e0f87541f7871ffde51c722d54550774fe1b7c3Mathias Agopian    T* m_ptr;
105b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian};
106b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
107b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#undef COMPARE
108b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
109b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// ---------------------------------------------------------------------------
110b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// No user serviceable parts below here.
111b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
112b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
113b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiansp<T>::sp(T* other)
1148db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        : m_ptr(other) {
1158db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (other)
1168db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        other->incStrong(this);
1178db925f7777834eae5af386f7f92a22478c88346Mathias Agopian}
118b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
119b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
120b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiansp<T>::sp(const sp<T>& other)
1218db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        : m_ptr(other.m_ptr) {
1228db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1238db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->incStrong(this);
1248db925f7777834eae5af386f7f92a22478c88346Mathias Agopian}
125b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
126b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T> template<typename U>
1278db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>::sp(U* other)
1288db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        : m_ptr(other) {
1298db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (other)
1308db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        ((T*) other)->incStrong(this);
131b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
132b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
133b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T> template<typename U>
134b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiansp<T>::sp(const sp<U>& other)
1358db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        : m_ptr(other.m_ptr) {
1368db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1378db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->incStrong(this);
1388db925f7777834eae5af386f7f92a22478c88346Mathias Agopian}
139b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
140b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
1418db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>::~sp() {
1428db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1438db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->decStrong(this);
144b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
145b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
146b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
1478db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>& sp<T>::operator =(const sp<T>& other) {
148b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    T* otherPtr(other.m_ptr);
1498db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (otherPtr)
1508db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        otherPtr->incStrong(this);
1518db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1528db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->decStrong(this);
153b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    m_ptr = otherPtr;
154b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return *this;
155b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
156b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
157b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
1588db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>& sp<T>::operator =(T* other) {
1598db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (other)
1608db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        other->incStrong(this);
1618db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1628db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->decStrong(this);
163b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    m_ptr = other;
164b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return *this;
165b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
166b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
167b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T> template<typename U>
1688db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>& sp<T>::operator =(const sp<U>& other) {
1697332f80db5b942253f69b9b2e6cc3ae08d957d0eMathias Agopian    T* otherPtr(other.m_ptr);
1708db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (otherPtr)
1718db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        otherPtr->incStrong(this);
1728db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1738db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->decStrong(this);
174b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    m_ptr = otherPtr;
175b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return *this;
176b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
177b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
178b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T> template<typename U>
1798db925f7777834eae5af386f7f92a22478c88346Mathias Agopiansp<T>& sp<T>::operator =(U* other) {
1808db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (other)
1818db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        ((T*) other)->incStrong(this);
1828db925f7777834eae5af386f7f92a22478c88346Mathias Agopian    if (m_ptr)
1838db925f7777834eae5af386f7f92a22478c88346Mathias Agopian        m_ptr->decStrong(this);
184b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    m_ptr = other;
185b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    return *this;
186b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
187b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
1888db925f7777834eae5af386f7f92a22478c88346Mathias Agopiantemplate<typename T>
1898db925f7777834eae5af386f7f92a22478c88346Mathias Agopianvoid sp<T>::force_set(T* other) {
190b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    other->forceIncStrong(this);
191b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    m_ptr = other;
192b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
193b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
194b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
1958db925f7777834eae5af386f7f92a22478c88346Mathias Agopianvoid sp<T>::clear() {
196b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    if (m_ptr) {
197b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian        m_ptr->decStrong(this);
198b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian        m_ptr = 0;
199b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian    }
200b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}
201b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
202b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopiantemplate<typename T>
2033e0f87541f7871ffde51c722d54550774fe1b7c3Mathias Agopianvoid sp<T>::set_pointer(T* ptr) {
2043e0f87541f7871ffde51c722d54550774fe1b7c3Mathias Agopian    m_ptr = ptr;
2053e0f87541f7871ffde51c722d54550774fe1b7c3Mathias Agopian}
206b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
207b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian}; // namespace android
208b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
209b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian// ---------------------------------------------------------------------------
210b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian
211b26ea8b30f11cf0ad11ac7983208514a1bfafb75Mathias Agopian#endif // ANDROID_STRONG_POINTER_H
212