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