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