From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WTF/wtf/RetainPtr.h | 487 +++++++++++++++++++++++---------------------- 1 file changed, 247 insertions(+), 240 deletions(-) (limited to 'Source/WTF/wtf/RetainPtr.h') diff --git a/Source/WTF/wtf/RetainPtr.h b/Source/WTF/wtf/RetainPtr.h index 9cf526701..3b3f8d9bc 100644 --- a/Source/WTF/wtf/RetainPtr.h +++ b/Source/WTF/wtf/RetainPtr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2013, 2014 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 @@ -21,6 +21,8 @@ #ifndef RetainPtr_h #define RetainPtr_h +#include + #if USE(CF) || defined(__OBJC__) #include @@ -45,288 +47,294 @@ namespace WTF { - // Unlike most most of our smart pointers, RetainPtr can take either the pointer type or the pointed-to type, - // so both RetainPtr and RetainPtr will work. +// Unlike most most of our smart pointers, RetainPtr can take either the pointer type or the pointed-to type, +// so both RetainPtr and RetainPtr will work. -#if !PLATFORM(IOS) - #define AdoptCF DeprecatedAdoptCF - #define AdoptNS DeprecatedAdoptNS -#endif +template class RetainPtr; - enum AdoptCFTag { AdoptCF }; - enum AdoptNSTag { AdoptNS }; - -#if defined(__OBJC__) && !__has_feature(objc_arc) -#ifdef OBJC_NO_GC - inline void adoptNSReference(id) - { - } -#else - inline void adoptNSReference(id ptr) - { - if (ptr) { - CFRetain(ptr); - [ptr release]; - } - } -#endif -#endif +template RetainPtr adoptCF(T CF_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; +template RetainPtr adoptNS(T NS_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; - template class RetainPtr { - public: - typedef typename std::remove_pointer::type ValueType; - typedef ValueType* PtrType; - typedef CFTypeRef StorageType; +template class RetainPtr { +public: + typedef typename std::remove_pointer::type ValueType; + typedef ValueType* PtrType; + typedef CFTypeRef StorageType; - RetainPtr() : m_ptr(0) {} - RetainPtr(PtrType ptr) : m_ptr(toStorageType(ptr)) { if (m_ptr) CFRetain(m_ptr); } + RetainPtr() : m_ptr(nullptr) { } + RetainPtr(PtrType ptr) : m_ptr(toStorageType(ptr)) { if (m_ptr) CFRetain(m_ptr); } - RetainPtr(AdoptCFTag, PtrType ptr) - : m_ptr(toStorageType(ptr)) - { -#ifdef __OBJC__ - static_assert((!std::is_convertible::value), "Don't use adoptCF with Objective-C pointer types, use adoptNS."); -#endif - } + RetainPtr(const RetainPtr& o) : m_ptr(o.m_ptr) { if (StorageType ptr = m_ptr) CFRetain(ptr); } -#if __has_feature(objc_arc) - RetainPtr(AdoptNSTag, PtrType ptr) : m_ptr(toStorageType(ptr)) { if (m_ptr) CFRetain(m_ptr); } -#else - RetainPtr(AdoptNSTag, PtrType ptr) - : m_ptr(toStorageType(ptr)) - { - adoptNSReference(ptr); - } -#endif - - RetainPtr(const RetainPtr& o) : m_ptr(o.m_ptr) { if (StorageType ptr = m_ptr) CFRetain(ptr); } + RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { } + template RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { } - RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { } - template RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { } + // Hash table deleted values, which are only constructed and never copied or destroyed. + RetainPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { } + bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); } + + ~RetainPtr(); + + template RetainPtr(const RetainPtr&); - // Hash table deleted values, which are only constructed and never copied or destroyed. - RetainPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { } - bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); } - - ~RetainPtr() { if (StorageType ptr = m_ptr) CFRelease(ptr); } - - template RetainPtr(const RetainPtr&); + void clear(); + PtrType leakRef() WARN_UNUSED_RETURN; + PtrType autorelease(); - void clear(); - PtrType leakRef() WARN_UNUSED_RETURN; + PtrType get() const { return fromStorageType(m_ptr); } + PtrType operator->() const { return fromStorageType(m_ptr); } + explicit operator PtrType() const { return fromStorageType(m_ptr); } + explicit operator bool() const { return m_ptr; } - PtrType get() const { return fromStorageType(m_ptr); } - PtrType operator->() const { return fromStorageType(m_ptr); } - explicit operator PtrType() const { return fromStorageType(m_ptr); } - explicit operator bool() const { return m_ptr; } + bool operator!() const { return !m_ptr; } - bool operator!() const { return !m_ptr; } - - // This conversion operator allows implicit conversion to bool but not to other integer types. - typedef StorageType RetainPtr::*UnspecifiedBoolType; - operator UnspecifiedBoolType() const { return m_ptr ? &RetainPtr::m_ptr : 0; } - - RetainPtr& operator=(const RetainPtr&); - template RetainPtr& operator=(const RetainPtr&); - RetainPtr& operator=(PtrType); - template RetainPtr& operator=(U*); +#if !(defined (__OBJC__) && __has_feature(objc_arc)) + // This function is useful for passing RetainPtrs to functions that return + // CF types as out parameters. + PtrType* operator&() + { + // Require that the pointer is null, to prevent leaks. + ASSERT(!m_ptr); - RetainPtr& operator=(RetainPtr&&); - template RetainPtr& operator=(RetainPtr&&); + return (PtrType*)&m_ptr; + } +#endif - void swap(RetainPtr&); + // This conversion operator allows implicit conversion to bool but not to other integer types. + typedef StorageType RetainPtr::*UnspecifiedBoolType; + operator UnspecifiedBoolType() const { return m_ptr ? &RetainPtr::m_ptr : nullptr; } + + RetainPtr& operator=(const RetainPtr&); + template RetainPtr& operator=(const RetainPtr&); + RetainPtr& operator=(PtrType); + template RetainPtr& operator=(U*); - private: - static PtrType hashTableDeletedValue() { return reinterpret_cast(-1); } + RetainPtr& operator=(RetainPtr&&); + template RetainPtr& operator=(RetainPtr&&); -#if defined (__OBJC__) && __has_feature(objc_arc) - template - typename std::enable_if::value, PtrType>::type - fromStorageTypeHelper(StorageType ptr) const - { - return (__bridge PtrType)ptr; - } - - template - typename std::enable_if::value, PtrType>::type - fromStorageTypeHelper(StorageType ptr) const - { - return (PtrType)ptr; - } - - PtrType fromStorageType(StorageType ptr) const { return fromStorageTypeHelper(ptr); } - StorageType toStorageType(id ptr) const { return (__bridge StorageType)ptr; } - StorageType toStorageType(CFTypeRef ptr) const { return (StorageType)ptr; } -#else - PtrType fromStorageType(StorageType ptr) const { return (PtrType)ptr; } - StorageType toStorageType(PtrType ptr) const { return (StorageType)ptr; } -#endif + void swap(RetainPtr&); - StorageType m_ptr; - }; + template friend RetainPtr adoptCF(U CF_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; + template friend RetainPtr adoptNS(U NS_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; - template template inline RetainPtr::RetainPtr(const RetainPtr& o) - : m_ptr(toStorageType(o.get())) - { - if (StorageType ptr = m_ptr) - CFRetain(ptr); - } +private: + enum AdoptTag { Adopt }; + RetainPtr(PtrType ptr, AdoptTag) : m_ptr(toStorageType(ptr)) { } - template inline void RetainPtr::clear() - { - if (StorageType ptr = m_ptr) { - m_ptr = 0; - CFRelease(ptr); - } - } + static PtrType hashTableDeletedValue() { return reinterpret_cast(-1); } - template inline typename RetainPtr::PtrType RetainPtr::leakRef() +#if defined (__OBJC__) && __has_feature(objc_arc) + template + typename std::enable_if::value, PtrType>::type + fromStorageTypeHelper(StorageType ptr) const { - PtrType ptr = fromStorageType(m_ptr); - m_ptr = 0; - return ptr; + return (__bridge PtrType)ptr; } - template inline RetainPtr& RetainPtr::operator=(const RetainPtr& o) + template + typename std::enable_if::value, PtrType>::type + fromStorageTypeHelper(StorageType ptr) const { - RetainPtr ptr = o; - swap(ptr); - return *this; + return (PtrType)ptr; } - template template inline RetainPtr& RetainPtr::operator=(const RetainPtr& o) - { - RetainPtr ptr = o; - swap(ptr); - return *this; - } + PtrType fromStorageType(StorageType ptr) const { return fromStorageTypeHelper(ptr); } + StorageType toStorageType(id ptr) const { return (__bridge StorageType)ptr; } + StorageType toStorageType(CFTypeRef ptr) const { return (StorageType)ptr; } +#else + PtrType fromStorageType(StorageType ptr) const { return (PtrType)ptr; } + StorageType toStorageType(PtrType ptr) const { return (StorageType)ptr; } +#endif - template inline RetainPtr& RetainPtr::operator=(PtrType optr) - { - RetainPtr ptr = optr; - swap(ptr); - return *this; - } + StorageType m_ptr; +}; - template template inline RetainPtr& RetainPtr::operator=(U* optr) - { - RetainPtr ptr = optr; - swap(ptr); - return *this; - } +template inline RetainPtr::~RetainPtr() +{ + if (StorageType ptr = std::exchange(m_ptr, nullptr)) + CFRelease(ptr); +} - template inline RetainPtr& RetainPtr::operator=(RetainPtr&& o) - { - RetainPtr ptr = std::move(o); - swap(ptr); - return *this; - } +// Helper function for creating a RetainPtr using template argument deduction. +template inline RetainPtr retainPtr(T) WARN_UNUSED_RETURN; - template template inline RetainPtr& RetainPtr::operator=(RetainPtr&& o) - { - RetainPtr ptr = std::move(o); - swap(ptr); - return *this; - } +template template inline RetainPtr::RetainPtr(const RetainPtr& o) + : m_ptr(toStorageType(o.get())) +{ + if (StorageType ptr = m_ptr) + CFRetain(ptr); +} - template inline void RetainPtr::swap(RetainPtr& o) - { - std::swap(m_ptr, o.m_ptr); - } +template inline void RetainPtr::clear() +{ + if (StorageType ptr = std::exchange(m_ptr, nullptr)) + CFRelease(ptr); +} - template inline void swap(RetainPtr& a, RetainPtr& b) - { - a.swap(b); - } +template inline typename RetainPtr::PtrType RetainPtr::leakRef() +{ + return fromStorageType(std::exchange(m_ptr, nullptr)); +} - template inline bool operator==(const RetainPtr& a, const RetainPtr& b) - { - return a.get() == b.get(); - } +#ifdef __OBJC__ +template inline auto RetainPtr::autorelease() -> PtrType +{ + return (__bridge PtrType)CFBridgingRelease(leakRef()); +} +#endif - template inline bool operator==(const RetainPtr& a, U* b) - { - return a.get() == b; - } +template inline RetainPtr& RetainPtr::operator=(const RetainPtr& o) +{ + RetainPtr ptr = o; + swap(ptr); + return *this; +} + +template template inline RetainPtr& RetainPtr::operator=(const RetainPtr& o) +{ + RetainPtr ptr = o; + swap(ptr); + return *this; +} + +template inline RetainPtr& RetainPtr::operator=(PtrType optr) +{ + RetainPtr ptr = optr; + swap(ptr); + return *this; +} + +template template inline RetainPtr& RetainPtr::operator=(U* optr) +{ + RetainPtr ptr = optr; + swap(ptr); + return *this; +} + +template inline RetainPtr& RetainPtr::operator=(RetainPtr&& o) +{ + RetainPtr ptr = WTFMove(o); + swap(ptr); + return *this; +} + +template template inline RetainPtr& RetainPtr::operator=(RetainPtr&& o) +{ + RetainPtr ptr = WTFMove(o); + swap(ptr); + return *this; +} + +template inline void RetainPtr::swap(RetainPtr& o) +{ + std::swap(m_ptr, o.m_ptr); +} + +template inline void swap(RetainPtr& a, RetainPtr& b) +{ + a.swap(b); +} + +template inline bool operator==(const RetainPtr& a, const RetainPtr& b) +{ + return a.get() == b.get(); +} + +template inline bool operator==(const RetainPtr& a, U* b) +{ + return a.get() == b; +} + +template inline bool operator==(T* a, const RetainPtr& b) +{ + return a == b.get(); +} + +template inline bool operator!=(const RetainPtr& a, const RetainPtr& b) +{ + return a.get() != b.get(); +} + +template inline bool operator!=(const RetainPtr& a, U* b) +{ + return a.get() != b; +} + +template inline bool operator!=(T* a, const RetainPtr& b) +{ + return a != b.get(); +} + +template inline RetainPtr adoptCF(T CF_RELEASES_ARGUMENT ptr) +{ +#ifdef __OBJC__ + static_assert((!std::is_convertible::value), "Don't use adoptCF with Objective-C pointer types, use adoptNS."); +#endif + return RetainPtr(ptr, RetainPtr::Adopt); +} - template inline bool operator==(T* a, const RetainPtr& b) - { - return a == b.get(); - } +#ifdef __OBJC__ +template inline RetainPtr adoptNS(T NS_RELEASES_ARGUMENT ptr) +{ +#if __has_feature(objc_arc) + return ptr; +#elif defined(OBJC_NO_GC) + return RetainPtr(ptr, RetainPtr::Adopt); +#else + RetainPtr result = ptr; + [ptr release]; + return result; +#endif +} +#endif - template inline bool operator!=(const RetainPtr& a, const RetainPtr& b) - { - return a.get() != b.get(); - } +template inline RetainPtr retainPtr(T ptr) +{ + return ptr; +} - template inline bool operator!=(const RetainPtr& a, U* b) - { - return a.get() != b; - } +template struct IsSmartPtr> { + static const bool value = true; +}; - template inline bool operator!=(T* a, const RetainPtr& b) - { - return a != b.get(); - } +template struct HashTraits> : SimpleClassHashTraits> { +}; + +template struct DefaultHash> { + typedef PtrHash> Hash; +}; - template inline RetainPtr adoptCF(T CF_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; - template inline RetainPtr adoptCF(T CF_RELEASES_ARGUMENT o) +template +struct RetainPtrObjectHashTraits : SimpleClassHashTraits> { + static const RetainPtr

& emptyValue() { - return RetainPtr(AdoptCF, o); + static RetainPtr

& null = *(new RetainPtr

); + return null; } +}; - template inline RetainPtr adoptNS(T NS_RELEASES_ARGUMENT) WARN_UNUSED_RETURN; - template inline RetainPtr adoptNS(T NS_RELEASES_ARGUMENT o) +template +struct RetainPtrObjectHash { + static unsigned hash(const RetainPtr

& o) { - return RetainPtr(AdoptNS, o); + ASSERT_WITH_MESSAGE(o.get(), "attempt to use null RetainPtr in HashTable"); + return static_cast(CFHash(o.get())); } - - // Helper function for creating a RetainPtr using template argument deduction. - template inline RetainPtr retainPtr(T) WARN_UNUSED_RETURN; - template inline RetainPtr retainPtr(T o) + static bool equal(const RetainPtr

& a, const RetainPtr

& b) { - return o; + return CFEqual(a.get(), b.get()); } + static const bool safeToCompareToEmptyOrDeleted = false; +}; - template struct HashTraits> : SimpleClassHashTraits> { }; - - template struct PtrHash> : PtrHash::PtrType> { - using PtrHash::PtrType>::hash; - static unsigned hash(const RetainPtr

& key) { return hash(key.get()); } - using PtrHash::PtrType>::equal; - static bool equal(const RetainPtr

& a, const RetainPtr

& b) { return a == b; } - static bool equal(typename RetainPtr

::PtrType a, const RetainPtr

& b) { return a == b; } - static bool equal(const RetainPtr

& a, typename RetainPtr

::PtrType b) { return a == b; } - }; - - template struct DefaultHash> { typedef PtrHash> Hash; }; - - template - struct RetainPtrObjectHashTraits : SimpleClassHashTraits> { - static const RetainPtr

& emptyValue() - { - static RetainPtr

& null = *(new RetainPtr

); - return null; - } - }; - - template - struct RetainPtrObjectHash { - static unsigned hash(const RetainPtr

& o) - { - ASSERT_WITH_MESSAGE(o.get(), "attempt to use null RetainPtr in HashTable"); - return static_cast(CFHash(o.get())); - } - static bool equal(const RetainPtr

& a, const RetainPtr

& b) - { - return CFEqual(a.get(), b.get()); - } - static const bool safeToCompareToEmptyOrDeleted = false; - }; - -#if !PLATFORM(IOS) - #undef AdoptCF - #undef AdoptNS +#ifdef __OBJC__ +template T* dynamic_objc_cast(id object) +{ + if ([object isKindOfClass:[T class]]) + return (T *)object; + + return nil; +} #endif } // namespace WTF @@ -336,9 +344,8 @@ using WTF::adoptCF; using WTF::adoptNS; using WTF::retainPtr; -#if PLATFORM(IOS) -using WTF::AdoptCF; -using WTF::AdoptNS; +#ifdef __OBJC__ +using WTF::dynamic_objc_cast; #endif #endif // USE(CF) || defined(__OBJC__) -- cgit v1.2.1