haikuwebkit/Source/WTF/wtf/CheckedPtr.h

228 lines
7.3 KiB
C
Raw Permalink Normal View History

Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
/*
* Copyright (C) 2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
#include <wtf/CheckedRef.h>
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
namespace WTF {
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
template<typename T, typename PtrTraits>
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
class CheckedPtr {
WTF_MAKE_FAST_ALLOCATED;
public:
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
constexpr CheckedPtr()
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
: m_ptr(nullptr)
{ }
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
constexpr CheckedPtr(std::nullptr_t)
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
: m_ptr(nullptr)
{ }
ALWAYS_INLINE CheckedPtr(T* ptr)
: m_ptr { ptr }
{
refIfNotNull();
}
ALWAYS_INLINE CheckedPtr(const CheckedPtr& other)
: m_ptr { other.m_ptr }
{
refIfNotNull();
}
ALWAYS_INLINE CheckedPtr(CheckedPtr&& other)
: m_ptr { PtrTraits::exchange(other.m_ptr, nullptr) }
{ }
ALWAYS_INLINE ~CheckedPtr()
{
derefIfNotNull();
}
template<typename OtherType, typename OtherPtrTraits> CheckedPtr(const CheckedPtr<OtherType, OtherPtrTraits>& other)
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
: CheckedPtr(OtherPtrTraits::unwrap(other.m_ptr))
{ }
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
template<typename OtherType, typename OtherPtrTraits> CheckedPtr(CheckedPtr<OtherType, OtherPtrTraits>&& other)
: m_ptr { PtrTraits::exchange(other.m_ptr, nullptr) }
{ }
Add CheckedRef https://bugs.webkit.org/show_bug.cgi?id=227164 Reviewed by Geoffrey Garen. Source/WTF: Like r278344, this patch introduces a new type of smart pointer, CheckedRef, which lets each object keep track of pointers pointing to the object. As with CheckedPtr, the purpose of the internal counter for CheckedRef is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. This patch also removes makeCheckedPtr in favor of using CheckedPtr with template argument deduction in C++17. * WTF.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/CheckedPtr.h: (WTF::CheckedPtr::CheckedPtr): Added variants which take CheckedRef as arguments. (WTF::makeCheckedPtr): Deleted. (WTF::CanMakeCheckedPtr): Moved to CheckedRef.h * wtf/CheckedRef.h: Added. (WTF::CheckedRef::~CheckedRef): Added. (WTF::CheckedRef::CheckedRef): Added. (WTF::CheckedRef::isHashTableDeletedValue const): Added. (WTF::CheckedRef::isHashTableEmptyValue const): Added. (WTF::CheckedRef::hashTableEmptyValue): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue const): Added. (WTF::CheckedRef::ptrAllowingHashTableEmptyValue): Added. (WTF::CheckedRef::ptr const): Added. (WTF::CheckedRef::ptr): Added. (WTF::CheckedRef::get const): Added. (WTF::CheckedRef::get): Added. (WTF::CheckedRef::operator-> const): Added. (WTF::CheckedRef::operator->): Added. (WTF::CheckedRef::operator const T& const): Added. (WTF::CheckedRef::operator T&): Added. (WTF::CheckedRef::operator! const): Added. (WTF::CheckedRef::operator=): Added. (WTF::CheckedRef::releasePtr): Added. Returns m_ptr without calling decrementPtrCount. This is equivalent of leakPtr in Ref but we don't call this that since CheckedRef or CheckedPtr is generally not used to manage the object lifetime. (WTF::CheckedRef::poison): Added. (WTF::CheckedRef::unpoison): Added. (WTF::is): Added. (WTF::CheckedRefHashTraits): Added. (WTF::CheckedRefHashTraits::emptyValue): Added. (WTF::CheckedRefHashTraits::constructEmptyValue): Added. (WTF::CheckedRefHashTraits::isEmptyValue): Added. (WTF::CheckedRefHashTraits::peek): Added. (WTF::CheckedRefHashTraits::take): Added. (WTF::CanMakeCheckedPtr): Moved from CheckedPtr.h * wtf/Forward.h: Tools: Added some unit tests for CheckedRef and updated the unit tests for CheckedPtr per the removal of makeCheckedPtr. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: (WTF_CheckedPtr.CheckedRef): Added * TestWebKitAPI/Tests/WTF/CheckedRef.cpp: Added. (TestWebKitAPI..CheckedObject): Added. (TestWebKitAPI..DerivedCheckedObject): Added. (WTF_CheckedRef.Basic): Added. (WTF_CheckedRef.DerivedClass): Added. (WTF_CheckedRef.HashSet): Added. Canonical link: https://commits.webkit.org/240183@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280559 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-08-02 21:46:29 +00:00
CheckedPtr(CheckedRef<T, PtrTraits>& other)
: CheckedPtr(PtrTraits::unwrap(other.m_ptr))
{ }
template<typename OtherType, typename OtherPtrTraits> CheckedPtr(const CheckedRef<OtherType, OtherPtrTraits>& other)
: CheckedPtr(OtherPtrTraits::unwrap(other.m_ptr))
{ }
CheckedPtr(CheckedRef<T, PtrTraits>&& other)
: m_ptr { other.releasePtr() }
{
ASSERT(get());
}
template<typename OtherType, typename OtherPtrTraits> CheckedPtr(CheckedRef<OtherType, OtherPtrTraits>&& other)
: m_ptr { other.releasePtr() }
{
ASSERT(get());
}
Add CheckedPtr https://bugs.webkit.org/show_bug.cgi?id=226158 Reviewed by Antti Koivisto. Source/WTF: This patch introduces a new type of smart pointer, CheckedPtr, which behaves like RefPtr and let each object keep track of pointers pointing to the object. Unlike CheckedPtr, the purpose of this internal counter is to release assert that there is no outstanding pointer at the time of destruction instead of keeping the object alive when there is one. * WTF.xcodeproj/project.pbxproj: * wtf/CheckedPtr.h: Added. (WTF::CheckedPtr): Added. (WTF::CheckedPtr::CheckedPtr): Added. (WTF::CheckedPtr::~CheckedPtr): Added. (WTF::CheckedPtr::isHashTableDeletedValue const): Added. (WTF::CheckedPtr::operator UnspecifiedBoolType const): Added. (WTF::CheckedPtr::operator! const): Added. (WTF::CheckedPtr::get const): Added. (WTF::CheckedPtr::get): Added. (WTF::CheckedPtr::operator* const): Added. (WTF::CheckedPtr::operator*): Added. (WTF::CheckedPtr::operator-> const): Added. (WTF::CheckedPtr::operator->): Added. (WTF::CheckedPtr::operator== const): Added. (WTF::CheckedPtr::operator=): Added. (WTF::CheckedPtr::unspecifiedBoolTypeInstance const): Added. (WTF::CheckedPtr::refIfNotNull): Added. (WTF::CheckedPtr::derefIfNotNull): Added. (WTF::makeCheckedPtr): Added. (WTF::is): Added. (WTF::CanMakeCheckedPtr): Added. (WTF::CanMakeCheckedPtr::~CanMakeCheckedPtr): Added. Release assert that m_ptrCount is 0. (WTF::CanMakeCheckedPtr::ptrCount const): Added. (WTF::CanMakeCheckedPtr::incrementPtrCount): Added. (WTF::CanMakeCheckedPtr::decrementPtrCount): Added. Note that we don't do anything when m_ptrCount becomes 0 unlike RefPtr. (WTF::HashTraits<CheckedPtr<P>>): Added. (WTF::HashTraits<CheckedPtr<P>>::emptyValue): Added. (WTF::HashTraits<CheckedPtr<P>>::peek): Added. (WTF::HashTraits<CheckedPtr<P>>::customDeleteBucket): Added. Tools: Added basic tests. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedPtr.cpp: Added. (TestWebKitAPI::CheckedObject): Added. (TestWebKitAPI::DerivedCheckedObject): Added. (WTF_CheckedPtr.Basic): (WTF_CheckedPtr.DerivedClass): (WTF_CheckedPtr.HashSet): Canonical link: https://commits.webkit.org/238376@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278344 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-06-02 08:43:13 +00:00
CheckedPtr(HashTableDeletedValueType)
: m_ptr(PtrTraits::hashTableDeletedValue())
{ }
bool isHashTableDeletedValue() const { return PtrTraits::isHashTableDeletedValue(m_ptr); }
// This conversion operator allows implicit conversion to bool but not to other integer types.
using UnspecifiedBoolType = void (CheckedPtr::*)() const;
operator UnspecifiedBoolType() const { return m_ptr ? &CheckedPtr::unspecifiedBoolTypeInstance : nullptr; }
ALWAYS_INLINE bool operator!() const { return !PtrTraits::unwrap(m_ptr); }
ALWAYS_INLINE const T* get() const { return PtrTraits::unwrap(m_ptr); }
ALWAYS_INLINE T* get() { return PtrTraits::unwrap(m_ptr); }
ALWAYS_INLINE const T& operator*() const { ASSERT(this); return *get(); }
ALWAYS_INLINE T& operator*() { ASSERT(this); return *get(); }
ALWAYS_INLINE const T* operator->() const { return get(); }
ALWAYS_INLINE T* operator->() { return get(); }
bool operator==(const T* other) const { return m_ptr == other; }
template<typename U> bool operator==(U* other) const { return m_ptr == other; }
bool operator==(const CheckedPtr& other) const { return m_ptr == other.m_ptr; }
template<typename OtherType, typename OtherPtrTraits>
bool operator==(const CheckedPtr<OtherType, OtherPtrTraits>& other) const { return m_ptr == other.m_ptr; }
CheckedPtr& operator=(std::nullptr_t)
{
derefIfNotNull();
m_ptr = nullptr;
return *this;
}
CheckedPtr& operator=(T* ptr)
{
CheckedPtr copy { ptr };
PtrTraits::swap(m_ptr, copy.m_ptr);
return *this;
}
CheckedPtr& operator=(const CheckedPtr& other)
{
CheckedPtr copy { other };
PtrTraits::swap(m_ptr, copy.m_ptr);
return *this;
}
template<typename OtherType, typename OtherPtrTraits> CheckedPtr& operator=(const CheckedPtr<OtherType, OtherPtrTraits>& other)
{
CheckedPtr copy { other };
PtrTraits::swap(m_ptr, copy.m_ptr);
return *this;
}
CheckedPtr& operator=(CheckedPtr&& other)
{
CheckedPtr moved { WTFMove(other) };
PtrTraits::swap(m_ptr, moved.m_ptr);
return *this;
}
template<typename OtherType, typename OtherPtrTraits> CheckedPtr& operator=(CheckedPtr<OtherType, OtherPtrTraits>&& other)
{
CheckedPtr moved { WTFMove(other) };
PtrTraits::swap(m_ptr, moved.m_ptr);
return *this;
}
private:
template<typename OtherType, typename OtherPtrTraits> friend class CheckedPtr;
void unspecifiedBoolTypeInstance() const { }
ALWAYS_INLINE void refIfNotNull()
{
if (T* ptr = PtrTraits::unwrap(m_ptr); LIKELY(ptr))
ptr->incrementPtrCount();
}
ALWAYS_INLINE void derefIfNotNull()
{
if (T* ptr = PtrTraits::unwrap(m_ptr); LIKELY(ptr))
ptr->decrementPtrCount();
}
typename PtrTraits::StorageType m_ptr;
};
template <typename T, typename PtrTraits>
struct GetPtrHelper<CheckedPtr<T, PtrTraits>> {
typedef T* PtrType;
static T* getPtr(const CheckedPtr<T, PtrTraits>& p) { return const_cast<T*>(p.get()); }
};
template <typename T, typename U>
struct IsSmartPtr<CheckedPtr<T, U>> {
static constexpr bool value = true;
};
template<typename ExpectedType, typename ArgType, typename ArgPtrTraits>
inline bool is(CheckedPtr<ArgType, ArgPtrTraits>& source)
{
return is<ExpectedType>(source.get());
}
template<typename ExpectedType, typename ArgType, typename ArgPtrTraits>
inline bool is(const CheckedPtr<ArgType, ArgPtrTraits>& source)
{
return is<ExpectedType>(source.get());
}
template<typename P> struct HashTraits<CheckedPtr<P>> : SimpleClassHashTraits<CheckedPtr<P>> {
static P* emptyValue() { return nullptr; }
typedef P* PeekType;
static PeekType peek(const CheckedPtr<P>& value) { return value.get(); }
static PeekType peek(P* value) { return value; }
static void customDeleteBucket(CheckedPtr<P>& value)
{
// See unique_ptr's customDeleteBucket() for an explanation.
ASSERT(!SimpleClassHashTraits<CheckedPtr<P>>::isDeletedValue(value));
auto valueToBeDestroyed = WTFMove(value);
SimpleClassHashTraits<CheckedPtr<P>>::constructDeletedValue(value);
}
};
template<typename P> struct DefaultHash<CheckedPtr<P>> : PtrHash<CheckedPtr<P>> { };
} // namespace WTF
using WTF::CheckedPtr;