LCOV - code coverage report
Current view: top level - media/libstagefright/system/core/include/utils - StrongPointer.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 47 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 51 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13