X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/b37bf2e156556c589aea3e1f58a377f2b1189665..b80e619319b1def83d1e8b4f84042b661be1be7f:/wtf/OwnPtr.h diff --git a/wtf/OwnPtr.h b/wtf/OwnPtr.h index b46969d..af1684b 100644 --- a/wtf/OwnPtr.h +++ b/wtf/OwnPtr.h @@ -1,6 +1,5 @@ -// -*- mode: c++; c-basic-offset: 4 -*- /* - * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -22,57 +21,42 @@ #ifndef WTF_OwnPtr_h #define WTF_OwnPtr_h +#include "Assertions.h" +#include "Noncopyable.h" +#include "OwnPtrCommon.h" +#include "TypeTraits.h" #include -#include -#include - -#if PLATFORM(WIN) - -typedef struct HBITMAP__* HBITMAP; -typedef struct HBRUSH__* HBRUSH; -typedef struct HFONT__* HFONT; -typedef struct HPALETTE__* HPALETTE; -typedef struct HPEN__* HPEN; -typedef struct HRGN__* HRGN; - -#endif +#include namespace WTF { // Unlike most of our smart pointers, OwnPtr can take either the pointer type or the pointed-to type. - // FIXME: Share a single RemovePointer class template with RetainPtr. - template struct OwnPtrRemovePointer { typedef T type; }; - template struct OwnPtrRemovePointer { typedef T type; }; - - template inline void deleteOwnedPtr(T* ptr) - { - typedef char known[sizeof(T) ? 1 : -1]; - if (sizeof(known)) - delete ptr; - } - -#if PLATFORM(WIN) - void deleteOwnedPtr(HBITMAP); - void deleteOwnedPtr(HBRUSH); - void deleteOwnedPtr(HFONT); - void deleteOwnedPtr(HPALETTE); - void deleteOwnedPtr(HPEN); - void deleteOwnedPtr(HRGN); -#endif + template class PassOwnPtr; - template class OwnPtr : Noncopyable { + template class OwnPtr : public Noncopyable { public: - typedef typename OwnPtrRemovePointer::type ValueType; + typedef typename RemovePointer::Type ValueType; typedef ValueType* PtrType; explicit OwnPtr(PtrType ptr = 0) : m_ptr(ptr) { } + // See comment in PassOwnPtr.h for why this takes a const reference. + template OwnPtr(const PassOwnPtr& o); + + // This copy constructor is used implicitly by gcc when it generates + // transients for assigning a PassOwnPtr object to a stack-allocated + // OwnPtr object. It should never be called explicitly and gcc + // should optimize away the constructor when generating code. + OwnPtr(const OwnPtr& o); + ~OwnPtr() { deleteOwnedPtr(m_ptr); } PtrType get() const { return m_ptr; } PtrType release() { PtrType ptr = m_ptr; m_ptr = 0; return ptr; } + // FIXME: This should be renamed to adopt. void set(PtrType ptr) { ASSERT(!ptr || m_ptr != ptr); deleteOwnedPtr(m_ptr); m_ptr = ptr; } + void clear() { deleteOwnedPtr(m_ptr); m_ptr = 0; } ValueType& operator*() const { ASSERT(m_ptr); return *m_ptr; } @@ -84,19 +68,50 @@ namespace WTF { typedef PtrType OwnPtr::*UnspecifiedBoolType; operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::m_ptr : 0; } + OwnPtr& operator=(const PassOwnPtr&); + template OwnPtr& operator=(const PassOwnPtr&); + void swap(OwnPtr& o) { std::swap(m_ptr, o.m_ptr); } private: PtrType m_ptr; }; - - template inline void swap(OwnPtr& a, OwnPtr& b) { a.swap(b); } + + template template inline OwnPtr::OwnPtr(const PassOwnPtr& o) + : m_ptr(o.release()) + { + } + + template inline OwnPtr& OwnPtr::operator=(const PassOwnPtr& o) + { + T* ptr = m_ptr; + m_ptr = o.release(); + ASSERT(!ptr || m_ptr != ptr); + if (ptr) + deleteOwnedPtr(ptr); + return *this; + } + + template template inline OwnPtr& OwnPtr::operator=(const PassOwnPtr& o) + { + T* ptr = m_ptr; + m_ptr = o.release(); + ASSERT(!ptr || m_ptr != ptr); + if (ptr) + deleteOwnedPtr(ptr); + return *this; + } + + template inline void swap(OwnPtr& a, OwnPtr& b) + { + a.swap(b); + } template inline bool operator==(const OwnPtr& a, U* b) - { + { return a.get() == b; } - + template inline bool operator==(T* a, const OwnPtr& b) { return a == b.get(); @@ -108,10 +123,10 @@ namespace WTF { } template inline bool operator!=(T* a, const OwnPtr& b) - { + { return a != b.get(); } - + template inline typename OwnPtr::PtrType getPtr(const OwnPtr& p) { return p.get();