15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *  Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  This library is free software; you can redistribute it and/or
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  modify it under the terms of the GNU Library General Public
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  License as published by the Free Software Foundation; either
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  version 2 of the License, or (at your option) any later version.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  This library is distributed in the hope that it will be useful,
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  but WITHOUT ANY WARRANTY; without even the implied warranty of
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Library General Public License for more details.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  You should have received a copy of the GNU Library General Public License
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  along with this library; see the file COPYING.LIB.  If not, write to
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Boston, MA 02110-1301, USA.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RefPtr and PassRefPtr are documented at http://webkit.org/coding/RefPtr.html
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTF_RefPtr_h
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_RefPtr_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <algorithm>
270019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/HashTableDeletedValueType.h"
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/RawPtr.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class PassRefPtr;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class RefPtr {
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(RefPtr);
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WTF_DISALLOW_ZERO_ASSIGNMENT(RefPtr);
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE RefPtr() : m_ptr(0) { }
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ALWAYS_INLINE RefPtr(std::nullptr_t) : m_ptr(0) { }
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE RefPtr(T* ptr) : m_ptr(ptr) { refIfNotNull(ptr); }
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        template<typename U> RefPtr(const RawPtr<U>& ptr, EnsurePtrConvertibleArgDecl(U, T)) : m_ptr(ptr.get()) { refIfNotNull(m_ptr); }
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        ALWAYS_INLINE explicit RefPtr(T& ref) : m_ptr(&ref) { m_ptr->ref(); }
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE RefPtr(const RefPtr& o) : m_ptr(o.m_ptr) { refIfNotNull(m_ptr); }
4523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        template<typename U> RefPtr(const RefPtr<U>& o, EnsurePtrConvertibleArgDecl(U, T)) : m_ptr(o.get()) { refIfNotNull(m_ptr); }
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtr(RefPtr&& o) : m_ptr(o.m_ptr) { o.m_ptr = 0; }
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtr& operator=(RefPtr&&);
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // See comments in PassRefPtr.h for an explanation of why this takes a const reference.
5323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        template<typename U> RefPtr(const PassRefPtr<U>&, EnsurePtrConvertibleArgDecl(U, T));
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Hash table deleted values, which are only constructed and never copied or destroyed.
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE ~RefPtr() { derefIfNotNull(m_ptr); }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ALWAYS_INLINE T* get() const { return m_ptr; }
6202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        void clear();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PassRefPtr<T> release() { PassRefPtr<T> tmp = adoptRef(m_ptr); m_ptr = 0; return tmp; }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T& operator*() const { return *m_ptr; }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE T* operator->() const { return m_ptr; }
6802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator!() const { return !m_ptr; }
7002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This conversion operator allows implicit conversion to bool but not to other integer types.
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef T* (RefPtr::*UnspecifiedBoolType);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }
7402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr& operator=(const RefPtr&);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr& operator=(T*);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr& operator=(const PassRefPtr<T>&);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr& operator=(std::nullptr_t) { clear(); return *this; }
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        template<typename U> RefPtr<T>& operator=(const RefPtr<U>&);
818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        template<typename U> RefPtr<T>& operator=(const PassRefPtr<U>&);
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        template<typename U> RefPtr<T>& operator=(const RawPtr<U>&);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        void swap(RefPtr&);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static T* hashTableDeletedValue() { return reinterpret_cast<T*>(-1); }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* m_ptr;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
9102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    template<typename T> template<typename U> inline RefPtr<T>::RefPtr(const PassRefPtr<U>& o, EnsurePtrConvertibleArgDefn(U, T))
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ptr(o.leakRef())
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline void RefPtr<T>::clear()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* ptr = m_ptr;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = 0;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        derefIfNotNull(ptr);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr& o)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
106c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr ptr = o;
107c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        swap(ptr);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(RefPtr&& o)
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME: Instead of explicitly casting to RefPtr&& here, we should use std::move, but that requires us to
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // have a standard library that supports move semantics.
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtr ptr = static_cast<RefPtr&&>(o);
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        swap(ptr);
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return *this;
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr<U>& o)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
124c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr ptr = o;
125c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        swap(ptr);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(T* optr)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
131c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr ptr = optr;
132c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        swap(ptr);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<T>& o)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
138c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr ptr = o;
139c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        swap(ptr);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<U>& o)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
145c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr ptr = o;
146c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        swap(ptr);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const RawPtr<U>& o)
15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RefPtr ptr = o.get();
15309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        swap(ptr);
15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return *this;
15509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
157c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    template<class T> inline void RefPtr<T>::swap(RefPtr& o)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        std::swap(m_ptr, o.m_ptr);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<class T> inline void swap(RefPtr<T>& a, RefPtr<T>& b)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        a.swap(b);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, const RefPtr<U>& b)
16802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
16902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b.get();
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, U* b)
17302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
17402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(T* a, const RefPtr<U>& b)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a == b.get();
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b)
18302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
18402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b.get();
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, U* b)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
18902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(T* a, const RefPtr<U>& b)
19302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
19402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a != b.get();
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    template<typename T, typename U> inline RefPtr<T> static_pointer_cast(const RefPtr<U>& p)
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
1991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return RefPtr<T>(static_cast<T*>(p.get()));
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline T* getPtr(const RefPtr<T>& p)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return p.get();
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    template<typename T> class RefPtrValuePeeker {
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    public:
209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ALWAYS_INLINE RefPtrValuePeeker(T* p): m_ptr(p) { }
210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ALWAYS_INLINE RefPtrValuePeeker(std::nullptr_t): m_ptr(0) { }
211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        template<typename U> RefPtrValuePeeker(const RefPtr<U>& p): m_ptr(p.get()) { }
212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        template<typename U> RefPtrValuePeeker(const PassRefPtr<U>& p): m_ptr(p.get()) { }
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ALWAYS_INLINE operator T*() const { return m_ptr; }
215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    private:
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        T* m_ptr;
217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::RefPtr;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::static_pointer_cast;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_RefPtr_h
225