1ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian/* 2ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * Copyright (C) 2005 The Android Open Source Project 3ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * 4ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * you may not use this file except in compliance with the License. 6ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * You may obtain a copy of the License at 7ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * 8ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * 10ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * Unless required by applicable law or agreed to in writing, software 11ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * See the License for the specific language governing permissions and 14ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian * limitations under the License. 15ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian */ 16ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 17ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#ifndef ANDROID_STRONG_POINTER_H 18ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#define ANDROID_STRONG_POINTER_H 19ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 20ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#include <cutils/atomic.h> 21ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 22ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#include <stdint.h> 23ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#include <sys/types.h> 24ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#include <stdlib.h> 25ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 26ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// --------------------------------------------------------------------------- 27ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiannamespace android { 28ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 29ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianclass TextOutput; 30ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias AgopianTextOutput& printStrongPointer(TextOutput& to, const void* val); 31ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 32ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> class wp; 33ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 34ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// --------------------------------------------------------------------------- 35ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 36ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#define COMPARE(_op_) \ 37ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const sp<T>& o) const { \ 38ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o.m_ptr; \ 39ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} \ 40ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const T* o) const { \ 41ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o; \ 42ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} \ 43ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename U> \ 44ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const sp<U>& o) const { \ 45ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o.m_ptr; \ 46ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} \ 47ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename U> \ 48ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const U* o) const { \ 49ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o; \ 50ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} \ 51ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const wp<T>& o) const { \ 52ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o.m_ptr; \ 53ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} \ 54ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename U> \ 55ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline bool operator _op_ (const wp<U>& o) const { \ 56ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return m_ptr _op_ o.m_ptr; \ 57ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 58ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 59ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// --------------------------------------------------------------------------- 60ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 61ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate <typename T> 62ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianclass sp 63ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 64ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianpublic: 65ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian inline sp() : m_ptr(0) { } 66ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 67ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian sp(T* other); 68ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian sp(const sp<T>& other); 69ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename U> sp(U* other); 70ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename U> sp(const sp<U>& other); 71ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 72ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian ~sp(); 73ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 74ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian // Assignment 75ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 76ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian sp& operator = (T* other); 77ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian sp& operator = (const sp<T>& other); 78ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 79ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename U> sp& operator = (const sp<U>& other); 80ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename U> sp& operator = (U* other); 81ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 82ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian //! Special optimization for use by ProcessState (and nobody else). 83ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian void force_set(T* other); 84ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 85ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian // Reset 86ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 87ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian void clear(); 88ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 89ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian // Accessors 90ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 91ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian inline T& operator* () const { return *m_ptr; } 92ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian inline T* operator-> () const { return m_ptr; } 93ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian inline T* get() const { return m_ptr; } 94ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 95ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian // Operators 96ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 97ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(==) 98ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(!=) 99ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(>) 100ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(<) 101ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(<=) 102ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian COMPARE(>=) 103ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 104ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianprivate: 105ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename Y> friend class sp; 106ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian template<typename Y> friend class wp; 10749862c3630632303c40ca37f1791ed4b092ce063Mathias Agopian void set_pointer(T* ptr); 10849862c3630632303c40ca37f1791ed4b092ce063Mathias Agopian T* m_ptr; 109ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian}; 110ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 111ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#undef COMPARE 112ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 113ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate <typename T> 114ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias AgopianTextOutput& operator<<(TextOutput& to, const sp<T>& val); 115ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 116ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// --------------------------------------------------------------------------- 117ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// No user serviceable parts below here. 118ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 119ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 120ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>::sp(T* other) 121ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian: m_ptr(other) 122ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian { 123ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (other) other->incStrong(this); 124ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian } 125ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 126ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 127ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>::sp(const sp<T>& other) 128ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian: m_ptr(other.m_ptr) 129ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian { 130ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->incStrong(this); 131ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian } 132ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 133ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> template<typename U> 134ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>::sp(U* other) : m_ptr(other) 135ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 13632a55cf66e12e5e56d2e05b73c6bef453477c2bbMathias Agopian if (other) ((T*)other)->incStrong(this); 137ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 138ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 139ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> template<typename U> 140ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>::sp(const sp<U>& other) 141ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian: m_ptr(other.m_ptr) 142ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian { 143ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->incStrong(this); 144ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian } 145ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 146ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 147ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>::~sp() 148ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 149ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->decStrong(this); 150ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 151ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 152ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 153ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>& sp<T>::operator = (const sp<T>& other) { 154ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian T* otherPtr(other.m_ptr); 155ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (otherPtr) otherPtr->incStrong(this); 156ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->decStrong(this); 157ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = otherPtr; 158ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return *this; 159ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 160ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 161ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 162ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>& sp<T>::operator = (T* other) 163ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 164ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (other) other->incStrong(this); 165ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->decStrong(this); 166ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = other; 167ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return *this; 168ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 169ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 170ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> template<typename U> 171ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>& sp<T>::operator = (const sp<U>& other) 172ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 17332a55cf66e12e5e56d2e05b73c6bef453477c2bbMathias Agopian T* otherPtr(other.m_ptr); 174ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (otherPtr) otherPtr->incStrong(this); 175ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->decStrong(this); 176ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = otherPtr; 177ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return *this; 178ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 179ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 180ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> template<typename U> 181ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiansp<T>& sp<T>::operator = (U* other) 182ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 18332a55cf66e12e5e56d2e05b73c6bef453477c2bbMathias Agopian if (other) ((T*)other)->incStrong(this); 184ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) m_ptr->decStrong(this); 185ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = other; 186ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return *this; 187ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 188ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 189ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 190ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianvoid sp<T>::force_set(T* other) 191ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 192ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian other->forceIncStrong(this); 193ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = other; 194ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 195ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 196ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 197ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianvoid sp<T>::clear() 198ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 199ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian if (m_ptr) { 200ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr->decStrong(this); 201ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian m_ptr = 0; 202ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian } 203ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 204ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 205ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate<typename T> 20649862c3630632303c40ca37f1791ed4b092ce063Mathias Agopianvoid sp<T>::set_pointer(T* ptr) { 20749862c3630632303c40ca37f1791ed4b092ce063Mathias Agopian m_ptr = ptr; 20849862c3630632303c40ca37f1791ed4b092ce063Mathias Agopian} 209ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 210ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopiantemplate <typename T> 211ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopianinline TextOutput& operator<<(TextOutput& to, const sp<T>& val) 212ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian{ 213ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian return printStrongPointer(to, val.get()); 214ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian} 215ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 216ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian}; // namespace android 217ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 218ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian// --------------------------------------------------------------------------- 219ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian 220ec122eb46b6ce8f6e8bb3e08c34e575de666cd3eMathias Agopian#endif // ANDROID_STRONG_POINTER_H 221