15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 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)#ifndef WTF_PassRefPtr_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_PassRefPtr_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/NullPtr.h"
2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/RawPtr.h"
2723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch#include "wtf/TypeTraits.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class RefPtr;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class PassRefPtr;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> PassRefPtr<T> adoptRef(T*);
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline void adopted(const void*) { }
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // requireAdoption() is not overloaded for WTF::RefCounted, which has a
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // built-in assumption that adoption is required. requireAdoption() is
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // for bootstrapping alternate reference count classes that are compatible
401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // with ReftPtr/PassRefPtr but cannot have adoption checks enabled
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // by default, such as skia's SkRefCnt. The purpose of requireAdoption()
421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // is to enable adoption checks only once it is known that the object will
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // be used with RefPtr/PassRefPtr.
441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    inline void requireAdoption(const void*) { }
451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    template<typename T> ALWAYS_INLINE void refIfNotNull(T* ptr)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (LIKELY(ptr != 0)) {
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            requireAdoption(ptr);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ptr->ref();
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        }
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    template<typename T> ALWAYS_INLINE void derefIfNotNull(T* ptr)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (LIKELY(ptr != 0))
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ptr->deref();
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class PassRefPtr {
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(PassRefPtr);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PassRefPtr() : m_ptr(0) { }
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        PassRefPtr(std::nullptr_t) : m_ptr(0) { }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PassRefPtr(T* ptr) : m_ptr(ptr) { refIfNotNull(ptr); }
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        template<typename U> PassRefPtr(const RawPtr<U>& ptr, EnsurePtrConvertibleArgDecl(U, T)) : m_ptr(ptr.get()) { refIfNotNull(m_ptr); }
67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        explicit PassRefPtr(T& ptr) : m_ptr(&ptr) { m_ptr->ref(); }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // It somewhat breaks the type system to allow transfer of ownership out of
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a const PassRefPtr. However, it makes it much easier to work with PassRefPtr
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // temporaries, and we don't have a need to use real const PassRefPtrs anyway.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PassRefPtr(const PassRefPtr& o) : m_ptr(o.leakRef()) { }
7223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        template<typename U> PassRefPtr(const PassRefPtr<U>& o, EnsurePtrConvertibleArgDecl(U, T)) : m_ptr(o.leakRef()) { }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ALWAYS_INLINE ~PassRefPtr() { derefIfNotNull(m_ptr); }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        template<typename U> PassRefPtr(const RefPtr<U>&, EnsurePtrConvertibleArgDecl(U, T));
7702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* get() const { return m_ptr; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* leakRef() const WARN_UNUSED_RETURN;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T& operator*() const { return *m_ptr; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* operator->() const { return m_ptr; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator!() const { return !m_ptr; }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This conversion operator allows implicit conversion to bool but not to other integer types.
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef T* (PassRefPtr::*UnspecifiedBoolType);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        operator UnspecifiedBoolType() const { return m_ptr ? &PassRefPtr::m_ptr : 0; }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        friend PassRefPtr adoptRef<T>(T*);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        enum AdoptRefTag { AdoptRef };
9551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        PassRefPtr(T* ptr, AdoptRefTag) : m_ptr(ptr) { }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        PassRefPtr& operator=(const PassRefPtr&) { COMPILE_ASSERT(!sizeof(T*), PassRefPtr_should_never_be_assigned_to); return *this; }
9806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        mutable T* m_ptr;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
10102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
10223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    template<typename T> template<typename U> inline PassRefPtr<T>::PassRefPtr(const RefPtr<U>& o, EnsurePtrConvertibleArgDefn(U, T))
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ptr(o.get())
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* ptr = m_ptr;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        refIfNotNull(ptr);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline T* PassRefPtr<T>::leakRef() const
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* ptr = m_ptr;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = 0;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ptr;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const PassRefPtr<U>& b)
11702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
11802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b.get();
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const RefPtr<U>& b)
12202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
12302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b.get();
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, const PassRefPtr<U>& b)
12702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
12802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b.get();
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, U* b)
13202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
13302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(T* a, const PassRefPtr<U>& b)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
13802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a == b.get();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
141323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    template<typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const RawPtr<U>& b)
142323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    {
143323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return a.get() == b.get();
144323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
146323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    template<typename T, typename U> inline bool operator==(const RawPtr<T>& a, const PassRefPtr<U>& b)
147323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    {
148323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return a.get() == b.get();
149323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
150323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
15102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const PassRefPtr<U>& b)
15202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
15302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b.get();
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const RefPtr<U>& b)
15702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
15802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b.get();
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const PassRefPtr<U>& b)
16202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
16302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b.get();
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, U* b)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator!=(T* a, const PassRefPtr<U>& b)
17202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
17302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a != b.get();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
176323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const RawPtr<U>& b)
177323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    {
178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return a.get() != b.get();
179323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
181323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const RawPtr<T>& a, const PassRefPtr<U>& b)
182323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    {
183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return a.get() != b.get();
184323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
185323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    template<typename T> PassRefPtr<T> adoptRef(T* p)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adopted(p);
18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return PassRefPtr<T>(p, PassRefPtr<T>::AdoptRef);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p)
19302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
19402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return adoptRef(static_cast<T*>(p.leakRef()));
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline T* getPtr(const PassRefPtr<T>& p)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return p.get();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::PassRefPtr;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::adoptRef;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::static_pointer_cast;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_PassRefPtr_h
209