15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Copyright (C) 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_OwnPtr_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_OwnPtr_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Noncopyable.h"
26591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/NullPtr.h"
27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/OwnPtrCommon.h"
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/TypeTraits.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <algorithm>
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <memory>
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Unlike most of our smart pointers, OwnPtr can take either the pointer type or the pointed-to type.
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class PassOwnPtr;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> PassOwnPtr<T> adoptPtr(T*);
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> class OwnPtr {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If rvalue references are not supported, the copy constructor is
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // public so OwnPtr cannot be marked noncopyable. See note below.
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WTF_MAKE_NONCOPYABLE(OwnPtr);
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(OwnPtr);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef typename RemovePointer<T>::Type ValueType;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef ValueType* PtrType;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr() : m_ptr(0) { }
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr(std::nullptr_t) : m_ptr(0) { }
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // See comment in PassOwnPtr.h for why this takes a const reference.
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> OwnPtr(const PassOwnPtr<U>& o);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This copy constructor is used implicitly by gcc when it generates
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // transients for assigning a PassOwnPtr<T> object to a stack-allocated
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // OwnPtr<T> object. It should never be called explicitly and gcc
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // should optimize away the constructor when generating code.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr(const OwnPtr<ValueType>&);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ~OwnPtr() { deleteOwnedPtr(m_ptr); }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType get() const { return m_ptr; }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        void clear();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PassOwnPtr<T> release();
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType leakPtr() WARN_UNUSED_RETURN;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ValueType& operator*() const { ASSERT(m_ptr); return *m_ptr; }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType operator->() const { ASSERT(m_ptr); return m_ptr; }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator!() const { return !m_ptr; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This conversion operator allows implicit conversion to bool but not to other integer types.
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef PtrType OwnPtr::*UnspecifiedBoolType;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::m_ptr : 0; }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr& operator=(const PassOwnPtr<T>&);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr& operator=(std::nullptr_t) { clear(); return *this; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> OwnPtr& operator=(const PassOwnPtr<U>&);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr(OwnPtr&&);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> OwnPtr(OwnPtr<U>&&);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr& operator=(OwnPtr&&);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> OwnPtr& operator=(OwnPtr<U>&&);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        void swap(OwnPtr& o) { std::swap(m_ptr, o.m_ptr); }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If rvalue references are supported, noncopyable takes care of this.
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OwnPtr& operator=(const OwnPtr&);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We should never have two OwnPtrs for the same underlying object (otherwise we'll get
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // double-destruction), so these equality operators should never be needed.
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> bool operator==(const OwnPtr<U>&) { COMPILE_ASSERT(!sizeof(U*), OwnPtrs_should_never_be_equal); return false; }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> bool operator!=(const OwnPtr<U>&) { COMPILE_ASSERT(!sizeof(U*), OwnPtrs_should_never_be_equal); return false; }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> bool operator==(const PassOwnPtr<U>&) { COMPILE_ASSERT(!sizeof(U*), OwnPtrs_should_never_be_equal); return false; }
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        template<typename U> bool operator!=(const PassOwnPtr<U>&) { COMPILE_ASSERT(!sizeof(U*), OwnPtrs_should_never_be_equal); return false; }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType m_ptr;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> template<typename U> inline OwnPtr<T>::OwnPtr(const PassOwnPtr<U>& o)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ptr(o.leakPtr())
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline void OwnPtr<T>::clear()
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = 0;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deleteOwnedPtr(ptr);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline PassOwnPtr<T> OwnPtr<T>::release()
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = 0;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptPtr(ptr);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline typename OwnPtr<T>::PtrType OwnPtr<T>::leakPtr()
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = 0;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ptr;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline OwnPtr<T>& OwnPtr<T>::operator=(const PassOwnPtr<T>& o)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = o.leakPtr();
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!ptr || m_ptr != ptr);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deleteOwnedPtr(ptr);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> template<typename U> inline OwnPtr<T>& OwnPtr<T>::operator=(const PassOwnPtr<U>& o)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = o.leakPtr();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!ptr || m_ptr != ptr);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deleteOwnedPtr(ptr);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline OwnPtr<T>::OwnPtr(OwnPtr<T>&& o)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ptr(o.leakPtr())
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> template<typename U> inline OwnPtr<T>::OwnPtr(OwnPtr<U>&& o)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_ptr(o.leakPtr())
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline OwnPtr<T>& OwnPtr<T>::operator=(OwnPtr<T>&& o)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = o.leakPtr();
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!ptr || m_ptr != ptr);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deleteOwnedPtr(ptr);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> template<typename U> inline OwnPtr<T>& OwnPtr<T>::operator=(OwnPtr<U>&& o)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PtrType ptr = m_ptr;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_ptr = o.leakPtr();
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!ptr || m_ptr != ptr);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deleteOwnedPtr(ptr);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline void swap(OwnPtr<T>& a, OwnPtr<T>& b)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        a.swap(b);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator==(const OwnPtr<T>& a, U* b)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
19402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() == b;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    template<typename T, typename U> inline bool operator==(T* a, const OwnPtr<U>& b)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
19902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a == b.get();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(const OwnPtr<T>& a, U* b)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
20402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a.get() != b;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T, typename U> inline bool operator!=(T* a, const OwnPtr<U>& b)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
20902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return a != b.get();
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename T> inline typename OwnPtr<T>::PtrType getPtr(const OwnPtr<T>& p)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return p.get();
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::OwnPtr;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_OwnPtr_h
222