diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/RefPtr.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/RefPtr.h')
-rw-r--r-- | Source/WTF/wtf/RefPtr.h | 389 |
1 files changed, 217 insertions, 172 deletions
diff --git a/Source/WTF/wtf/RefPtr.h b/Source/WTF/wtf/RefPtr.h index f26109352..fe1630c97 100644 --- a/Source/WTF/wtf/RefPtr.h +++ b/Source/WTF/wtf/RefPtr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2005-2017 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 @@ -23,195 +23,240 @@ #ifndef WTF_RefPtr_h #define WTF_RefPtr_h -#include "FastMalloc.h" -#include "PassRefPtr.h" #include <algorithm> #include <utility> +#include <wtf/FastMalloc.h> +#include <wtf/GetPtr.h> +#include <wtf/PassRefPtr.h> namespace WTF { - enum HashTableDeletedValueType { HashTableDeletedValue }; +template<typename T> class RefPtr; +template<typename T> RefPtr<T> adoptRef(T*); - template<typename T> class RefPtr { - WTF_MAKE_FAST_ALLOCATED; - public: - ALWAYS_INLINE RefPtr() : m_ptr(nullptr) { } - ALWAYS_INLINE RefPtr(T* ptr) : m_ptr(ptr) { refIfNotNull(ptr); } - ALWAYS_INLINE RefPtr(const RefPtr& o) : m_ptr(o.m_ptr) { refIfNotNull(m_ptr); } - template<typename U> RefPtr(const RefPtr<U>& o) : m_ptr(o.get()) { refIfNotNull(m_ptr); } +template<typename T> class RefPtr { + WTF_MAKE_FAST_ALLOCATED; +public: + typedef T ValueType; + typedef ValueType* PtrType; - ALWAYS_INLINE RefPtr(RefPtr&& o) : m_ptr(o.release().leakRef()) { } - template<typename U> RefPtr(RefPtr<U>&& o) : m_ptr(o.release().leakRef()) { } + static constexpr bool isRefPtr = true; - // See comments in PassRefPtr.h for an explanation of why this takes a const reference. - template<typename U> RefPtr(const PassRefPtr<U>&); + ALWAYS_INLINE RefPtr() : m_ptr(nullptr) { } + ALWAYS_INLINE RefPtr(T* ptr) : m_ptr(ptr) { refIfNotNull(ptr); } + ALWAYS_INLINE RefPtr(const RefPtr& o) : m_ptr(o.m_ptr) { refIfNotNull(m_ptr); } + template<typename U> RefPtr(const RefPtr<U>& o) : m_ptr(o.get()) { refIfNotNull(m_ptr); } - template<typename U> RefPtr(PassRef<U>); + ALWAYS_INLINE RefPtr(RefPtr&& o) : m_ptr(o.leakRef()) { } + template<typename U> RefPtr(RefPtr<U>&& o) : m_ptr(o.leakRef()) { } - // Hash table deleted values, which are only constructed and never copied or destroyed. - RefPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { } - bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); } + // See comments in PassRefPtr.h for an explanation of why this takes a const reference. + template<typename U> RefPtr(const PassRefPtr<U>&); - ALWAYS_INLINE ~RefPtr() { derefIfNotNull(m_ptr); } + template<typename U> RefPtr(Ref<U>&&); - T* get() const { return m_ptr; } - - void clear(); - PassRefPtr<T> release() { PassRefPtr<T> tmp = adoptRef(m_ptr); m_ptr = nullptr; return tmp; } - PassRef<T> releaseNonNull() { ASSERT(m_ptr); PassRef<T> tmp = adoptRef(*m_ptr); m_ptr = nullptr; return tmp; } + // Hash table deleted values, which are only constructed and never copied or destroyed. + RefPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { } + bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); } - T& operator*() const { return *m_ptr; } - ALWAYS_INLINE T* 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 T* (RefPtr::*UnspecifiedBoolType); - operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : nullptr; } - - RefPtr& operator=(const RefPtr&); - RefPtr& operator=(T*); - RefPtr& operator=(const PassRefPtr<T>&); - template<typename U> RefPtr& operator=(const RefPtr<U>&); - template<typename U> RefPtr& operator=(const PassRefPtr<U>&); - RefPtr& operator=(RefPtr&&); - template<typename U> RefPtr& operator=(RefPtr<U>&&); - template<typename U> RefPtr& operator=(PassRef<U>); - - void swap(RefPtr&); - - static T* hashTableDeletedValue() { return reinterpret_cast<T*>(-1); } - - private: - T* m_ptr; - }; - - template<typename T> template<typename U> inline RefPtr<T>::RefPtr(const PassRefPtr<U>& o) - : m_ptr(o.leakRef()) - { - } - - template<typename T> template<typename U> inline RefPtr<T>::RefPtr(PassRef<U> reference) - : m_ptr(&reference.leakRef()) - { - } - - template<typename T> inline void RefPtr<T>::clear() - { - T* ptr = m_ptr; - m_ptr = nullptr; - derefIfNotNull(ptr); - } - - template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr& o) - { - RefPtr ptr = o; - swap(ptr); - return *this; - } - - template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr<U>& o) - { - RefPtr ptr = o; - swap(ptr); - return *this; - } - - template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(T* optr) - { - RefPtr ptr = optr; - swap(ptr); - return *this; - } - - template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<T>& o) - { - RefPtr ptr = o; - swap(ptr); - return *this; - } - - template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<U>& o) - { - RefPtr ptr = o; - swap(ptr); - return *this; - } - - template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(RefPtr&& o) - { - RefPtr ptr = std::move(o); - swap(ptr); - return *this; - } - - template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(RefPtr<U>&& o) - { - RefPtr ptr = std::move(o); - swap(ptr); - return *this; - } - - template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(PassRef<U> reference) - { - RefPtr ptr = std::move(reference); - swap(ptr); - return *this; - } - - template<class T> inline void RefPtr<T>::swap(RefPtr& o) - { - std::swap(m_ptr, o.m_ptr); - } - - template<class T> inline void swap(RefPtr<T>& a, RefPtr<T>& b) - { - a.swap(b); - } - - template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, const RefPtr<U>& b) - { - return a.get() == b.get(); - } - - template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, U* b) - { - return a.get() == b; - } - - template<typename T, typename U> inline bool operator==(T* a, const RefPtr<U>& b) - { - return a == b.get(); - } - - template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b) - { - return a.get() != b.get(); - } - - template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, U* b) - { - return a.get() != b; - } - - template<typename T, typename U> inline bool operator!=(T* a, const RefPtr<U>& b) - { - return a != b.get(); - } - - template<typename T, typename U> inline RefPtr<T> static_pointer_cast(const RefPtr<U>& p) - { - return RefPtr<T>(static_cast<T*>(p.get())); - } + ALWAYS_INLINE ~RefPtr() { derefIfNotNull(std::exchange(m_ptr, nullptr)); } - template<typename T> inline T* getPtr(const RefPtr<T>& p) - { - return p.get(); - } + T* get() const { return m_ptr; } + + // FIXME: Remove release() and change all call sites to call WTFMove(). + RefPtr<T> release() { RefPtr<T> tmp = adoptRef(m_ptr); m_ptr = nullptr; return tmp; } + Ref<T> releaseNonNull() { ASSERT(m_ptr); Ref<T> tmp(adoptRef(*m_ptr)); m_ptr = nullptr; return tmp; } + Ref<const T> releaseConstNonNull() { ASSERT(m_ptr); Ref<const T> tmp(adoptRef(*m_ptr)); m_ptr = nullptr; return tmp; } + + T* leakRef() WARN_UNUSED_RETURN; + + T& operator*() const { ASSERT(m_ptr); return *m_ptr; } + ALWAYS_INLINE T* 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 T* (RefPtr::*UnspecifiedBoolType); + operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : nullptr; } + + RefPtr& operator=(const RefPtr&); + RefPtr& operator=(T*); + RefPtr& operator=(std::nullptr_t); + RefPtr& operator=(const PassRefPtr<T>&); + template<typename U> RefPtr& operator=(const RefPtr<U>&); + template<typename U> RefPtr& operator=(const PassRefPtr<U>&); + RefPtr& operator=(RefPtr&&); + template<typename U> RefPtr& operator=(RefPtr<U>&&); + template<typename U> RefPtr& operator=(Ref<U>&&); + + void swap(RefPtr&); + + static T* hashTableDeletedValue() { return reinterpret_cast<T*>(-1); } + +#if COMPILER_SUPPORTS(CXX_REFERENCE_QUALIFIED_FUNCTIONS) + RefPtr copyRef() && = delete; + RefPtr copyRef() const & WARN_UNUSED_RETURN { return RefPtr(m_ptr); } +#else + RefPtr copyRef() const WARN_UNUSED_RETURN { return RefPtr(m_ptr); } +#endif + +private: + friend RefPtr adoptRef<T>(T*); + + enum AdoptTag { Adopt }; + RefPtr(T* ptr, AdoptTag) : m_ptr(ptr) { } + + T* m_ptr; +}; + +template<typename T> template<typename U> inline RefPtr<T>::RefPtr(const PassRefPtr<U>& o) + : m_ptr(o.leakRef()) +{ +} + +template<typename T> template<typename U> inline RefPtr<T>::RefPtr(Ref<U>&& reference) + : m_ptr(&reference.leakRef()) +{ +} + +template<typename T> +inline T* RefPtr<T>::leakRef() +{ + return std::exchange(m_ptr, nullptr); +} + +template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr& o) +{ + RefPtr ptr = o; + swap(ptr); + return *this; +} + +template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const RefPtr<U>& o) +{ + RefPtr ptr = o; + swap(ptr); + return *this; +} + +template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(T* optr) +{ + RefPtr ptr = optr; + swap(ptr); + return *this; +} + +template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(std::nullptr_t) +{ + derefIfNotNull(std::exchange(m_ptr, nullptr)); + return *this; +} + +template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<T>& o) +{ + RefPtr ptr = o; + swap(ptr); + return *this; +} + +template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<U>& o) +{ + RefPtr ptr = o; + swap(ptr); + return *this; +} + +template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(RefPtr&& o) +{ + RefPtr ptr = WTFMove(o); + swap(ptr); + return *this; +} + +template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(RefPtr<U>&& o) +{ + RefPtr ptr = WTFMove(o); + swap(ptr); + return *this; +} + +template<typename T> template<typename U> inline RefPtr<T>& RefPtr<T>::operator=(Ref<U>&& reference) +{ + RefPtr ptr = WTFMove(reference); + swap(ptr); + return *this; +} + +template<class T> inline void RefPtr<T>::swap(RefPtr& o) +{ + std::swap(m_ptr, o.m_ptr); +} + +template<class T> inline void swap(RefPtr<T>& a, RefPtr<T>& b) +{ + a.swap(b); +} + +template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, const RefPtr<U>& b) +{ + return a.get() == b.get(); +} + +template<typename T, typename U> inline bool operator==(const RefPtr<T>& a, U* b) +{ + return a.get() == b; +} + +template<typename T, typename U> inline bool operator==(T* a, const RefPtr<U>& b) +{ + return a == b.get(); +} + +template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b) +{ + return a.get() != b.get(); +} + +template<typename T, typename U> inline bool operator!=(const RefPtr<T>& a, U* b) +{ + return a.get() != b; +} + +template<typename T, typename U> inline bool operator!=(T* a, const RefPtr<U>& b) +{ + return a != b.get(); +} + +template<typename T, typename U> inline RefPtr<T> static_pointer_cast(const RefPtr<U>& p) +{ + return RefPtr<T>(static_cast<T*>(p.get())); +} + +template <typename T> struct IsSmartPtr<RefPtr<T>> { + static const bool value = true; +}; + +template<typename T> inline RefPtr<T> adoptRef(T* p) +{ + adopted(p); + return RefPtr<T>(p, RefPtr<T>::Adopt); +} + +template<typename T> inline RefPtr<T> makeRefPtr(T* pointer) +{ + return pointer; +} + +template<typename T> inline RefPtr<T> makeRefPtr(T& reference) +{ + return &reference; +} } // namespace WTF using WTF::RefPtr; +using WTF::adoptRef; +using WTF::makeRefPtr; using WTF::static_pointer_cast; #endif // WTF_RefPtr_h |