Ignore:
Timestamp:
Dec 22, 2005, 8:48:08 AM (19 years ago)
Author:
darin
Message:

Reviewed by Maciej.

  • kxmlcore/PassRefPtr.h: (KXMLCore::PassRefPtr::PassRefPtr): Remove non-template constructor that takes RefPtr since the constructor template that takes RefPtr should be sufficient. Add a constructor template that takes PassRefPtr&. (KXMLCore::PassRefPtr::adopt): Use PassRefPtr_Ref to avoid setting pointer first to 0 and then to the pointer. (KXMLCore::PassRefPtr::operator=): Added template versions that take PassRefPtr& and RefPtr parameters. (KXMLCore::PassRefPtr::operator PassRefPtr<U>): Changed to fix leak -- old version would release and then ref. (KXMLCore::operator==): Make templates have two parameters so you can mix types. Also remove unneeded const in raw pointer versions. (KXMLCore::operator!=): Ditto.
  • kxmlcore/RefPtr.h: (KXMLCore::RefPtr::RefPtr): Add constructor template that takes PassRefPtr. (KXMLCore::RefPtr::operator=): Add assignment operator templates that take RefPtr and PassRefPtr. (KXMLCore::operator==): Make templates have two parameters so you can mix types. Also remove unneeded const in raw pointer versions. (KXMLCore::operator!=): Ditto.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kxmlcore/PassRefPtr.h

    r11684 r11727  
    4444        PassRefPtr() : m_ptr(0) {}
    4545        PassRefPtr(T *ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); }
    46         PassRefPtr(const RefPtr<T>& o) : m_ptr(o.get()) { if (T *ptr = m_ptr) ptr->ref(); }
    4746        PassRefPtr(PassRefPtr& o) : m_ptr(o.release()) {}
     47        template <typename U> PassRefPtr(PassRefPtr<U>& o) : m_ptr(o.release()) { }
    4848
    4949        ~PassRefPtr() { if (T *ptr = m_ptr) ptr->deref(); }
     
    5656        T *release() { T *tmp = m_ptr; m_ptr = 0; return tmp; }
    5757
    58         static PassRefPtr<T> adopt(T *ptr)
    59         {
    60             PassRefPtr result;
    61             result.m_ptr = ptr;
    62             return result;
     58        template <typename U> static PassRefPtr<T> adopt(U* ptr)
     59        {
     60            PassRefPtr result((PassRefPtr_Ref<T>(ptr)));
     61            return result;
    6362        }
    6463       
     
    7271        operator UnspecifiedBoolType() const { return m_ptr ? &PassRefPtr::get : 0; }
    7372       
    74         PassRefPtr& operator=(const RefPtr<T>&);
    7573        PassRefPtr& operator=(T *);
    7674        PassRefPtr& operator=(PassRefPtr&);
     75        template <typename U> PassRefPtr& operator=(PassRefPtr<U>&);
     76        template <typename U> PassRefPtr& operator=(const RefPtr<U>&);
    7777
    7878        PassRefPtr(PassRefPtr_Ref<T> ref) : m_ptr(ref.m_ptr) { }
     
    8686        }
    8787
    88         template<typename U>
    89         operator PassRefPtr_Ref<U>()
    90         {
    91             return PassRefPtr_Ref<U>(release());
    92         }
    93 
    94         template<typename U>
    95         operator PassRefPtr<U>()
    96         {
    97             return PassRefPtr<U>(this->release());
    98         }
     88        template <typename U> operator PassRefPtr_Ref<U>() { return PassRefPtr_Ref<U>(release()); }
     89        template <typename U> operator PassRefPtr<U>() { return PassRefPtr_Ref<U>(release()); }
    9990       
    10091    private:
     
    10293    };
    10394   
    104     template <class T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const RefPtr<T>& o)
     95    template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const RefPtr<U>& o)
    10596    {
    10697        T *optr = o.m_ptr;
     
    113104    }
    114105   
    115     template <class T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(T *optr)
     106    template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(T* optr)
    116107    {
    117108        if (optr)
     
    123114    }
    124115
    125     template <class T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<T>& ref)
     116    template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<T>& ref)
    126117    {
    127118        T *optr = ref.release();
     
    132123    }
    133124   
    134     template <class T> inline bool operator==(const PassRefPtr<T>& a, const PassRefPtr<T>& b)
     125    template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<U>& ref)
     126    {
     127        T *optr = ref.release();
     128        if (T *ptr = m_ptr)
     129            ptr->deref();
     130        m_ptr = optr;
     131        return *this;
     132    }
     133   
     134    template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const PassRefPtr<U>& b)
    135135    {
    136136        return a.get() == b.get();
    137137    }
    138138
    139     template <class T> inline bool operator==(const PassRefPtr<T>& a, const RefPtr<T>& b)
     139    template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const RefPtr<U>& b)
    140140    {
    141141        return a.get() == b.get();
    142142    }
    143143
    144     template <class T> inline bool operator==(const RefPtr<T>& a, const PassRefPtr<T>& b)
     144    template <typename T, typename U> inline bool operator==(const RefPtr<T>& a, const PassRefPtr<U>& b)
    145145    {
    146146        return a.get() == b.get();
    147147    }
    148148
    149     template <class T> inline bool operator==(const PassRefPtr<T>& a, const T *b)
     149    template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, U* b)
    150150    {
    151151        return a.get() == b;
    152152    }
    153153   
    154     template <class T> inline bool operator==(const T *a, const PassRefPtr<T>& b)
     154    template <typename T, typename U> inline bool operator==(T* a, const PassRefPtr<U>& b)
    155155    {
    156156        return a == b.get();
    157157    }
    158158   
    159     template <class T> inline bool operator!=(const PassRefPtr<T>& a, const PassRefPtr<T>& b)
     159    template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const PassRefPtr<U>& b)
    160160    {
    161161        return a.get() != b.get();
    162162    }
    163163
    164     template <class T> inline bool operator!=(const PassRefPtr<T>& a, const RefPtr<T>& b)
     164    template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const RefPtr<U>& b)
    165165    {
    166166        return a.get() != b.get();
    167167    }
    168168
    169     template <class T> inline bool operator!=(const RefPtr<T>& a, const PassRefPtr<T>& b)
     169    template <typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const PassRefPtr<U>& b)
    170170    {
    171171        return a.get() != b.get();
    172172    }
    173173
    174     template <class T> inline bool operator!=(const PassRefPtr<T>& a, const T *b)
     174    template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, U* b)
    175175    {
    176176        return a.get() != b;
    177177    }
    178178
    179     template <class T> inline bool operator!=(const T *a, const PassRefPtr<T>& b)
     179    template <typename T, typename U> inline bool operator!=(T* a, const PassRefPtr<U>& b)
    180180    {
    181181        return a != b.get();
    182182    }
    183183   
    184     template <class T, class U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p)
     184    template <typename T, typename U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p)
    185185    {
    186186        return PassRefPtr<T>::adopt(static_cast<T *>(p.release()));
    187187    }
    188188
    189     template <class T, class U> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p)
     189    template <typename T, typename U> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p)
    190190    {
    191191        return PassRefPtr<T>::adopt(const_cast<T *>(p.release()));
Note: See TracChangeset for help on using the changeset viewer.