StrongPointer.h revision 89daad6bae798779e57f252e9da4fe4e62337124
18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Copyright (C) 2013 The Android Open Source Project
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle *
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Licensed under the Apache License, Version 2.0 (the "License");
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * you may not use this file except in compliance with the License.
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * You may obtain a copy of the License at
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle *
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle *      http://www.apache.org/licenses/LICENSE-2.0
98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath *
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * Unless required by applicable law or agreed to in writing, software
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS,
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * See the License for the specific language governing permissions and
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * limitations under the License.
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#ifndef RS_STRONG_POINTER_H
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#define RS_STRONG_POINTER_H
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//#include <cutils/atomic.h>
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <stdint.h>
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <sys/types.h>
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <stdlib.h>
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// ---------------------------------------------------------------------------
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlenamespace android {
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathnamespace RSC {
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathclass TextOutput;
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan KamathTextOutput& printStrongPointer(TextOutput& to, const void* val);
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathtemplate<typename T> class wp;
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
35b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak// ---------------------------------------------------------------------------
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#define COMPARE(_op_)                                           \
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const sp<T>& o) const {              \
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return m_ptr _op_ o.m_ptr;                                  \
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}                                                               \
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const T* o) const {                  \
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return m_ptr _op_ o;                                        \
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}                                                               \
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U>                                            \
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const sp<U>& o) const {              \
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return m_ptr _op_ o.m_ptr;                                  \
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}                                                               \
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U>                                            \
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const U* o) const {                  \
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return m_ptr _op_ o;                                        \
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}                                                               \
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const wp<T>& o) const {              \
53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    return m_ptr _op_ o.m_ptr;                                  \
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}                                                               \
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U>                                            \
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const wp<U>& o) const {              \
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return m_ptr _op_ o.m_ptr;                                  \
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// ---------------------------------------------------------------------------
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T>
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleclass sp
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic:
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    inline sp() : m_ptr(0) { }
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    sp(T* other);
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    sp(const sp<T>& other);
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename U> sp(U* other);
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename U> sp(const sp<U>& other);
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    ~sp();
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Assignment
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    sp& operator = (T* other);
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    sp& operator = (const sp<T>& other);
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename U> sp& operator = (const sp<U>& other);
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename U> sp& operator = (U* other);
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    //! Special optimization for use by ProcessState (and nobody else).
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void force_set(T* other);
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Reset
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void clear();
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Accessors
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    inline  T&      operator* () const  { return *m_ptr; }
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    inline  T*      operator-> () const { return m_ptr;  }
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    inline  T*      get() const         { return m_ptr; }
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Operators
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(==)
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(!=)
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(>)
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(<)
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(<=)
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    COMPARE(>=)
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleprivate:
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename Y> friend class sp;
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    template<typename Y> friend class wp;
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void set_pointer(T* ptr);
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    T* m_ptr;
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle};
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#undef COMPARE
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T>
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin JuravleTextOutput& operator<<(TextOutput& to, const sp<T>& val);
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// ---------------------------------------------------------------------------
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// No user serviceable parts below here.
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(T* other)
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other)
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  {
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (other) other->incStrong(this);
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  }
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(const sp<T>& other)
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other.m_ptr)
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  {
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->incStrong(this);
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  }
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U>
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(U* other) : m_ptr(other)
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (other) ((T*)other)->incStrong(this);
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U>
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(const sp<U>& other)
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other.m_ptr)
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  {
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->incStrong(this);
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle  }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::~sp()
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->decStrong(this);
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (const sp<T>& other) {
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    T* otherPtr(other.m_ptr);
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (otherPtr) otherPtr->incStrong(this);
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->decStrong(this);
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = otherPtr;
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return *this;
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (T* other)
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (other) other->incStrong(this);
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->decStrong(this);
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = other;
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return *this;
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U>
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (const sp<U>& other)
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    T* otherPtr(other.m_ptr);
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (otherPtr) otherPtr->incStrong(this);
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->decStrong(this);
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = otherPtr;
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return *this;
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U>
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (U* other)
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (other) ((T*)other)->incStrong(this);
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) m_ptr->decStrong(this);
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = other;
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return *this;
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::force_set(T* other)
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    other->forceIncStrong(this);
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = other;
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::clear()
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    if (m_ptr) {
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        m_ptr->decStrong(this);
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        m_ptr = 0;
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T>
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::set_pointer(T* ptr) {
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    m_ptr = ptr;
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T>
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline TextOutput& operator<<(TextOutput& to, const sp<T>& val)
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    return printStrongPointer(to, val.get());
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}; // namespace RSC
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}; // namespace android
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// ---------------------------------------------------------------------------
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#endif // RS_STRONG_POINTER_H
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle