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