haikuwebkit/Source/WTF/wtf/LoggingHashSet.h

252 lines
7.3 KiB
C
Raw Permalink Normal View History

Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark https://bugs.webkit.org/show_bug.cgi?id=169590 Reviewed by Saam Barati. Source/JavaScriptCore: Adds code to support logging some hashtable stuff in the DFG. * dfg/DFGAvailabilityMap.cpp: (JSC::DFG::AvailabilityMap::pruneHeap): * dfg/DFGCombinedLiveness.cpp: (JSC::DFG::liveNodesAtHead): (JSC::DFG::CombinedLiveness::CombinedLiveness): * dfg/DFGCombinedLiveness.h: * dfg/DFGLivenessAnalysisPhase.cpp: (JSC::DFG::LivenessAnalysisPhase::run): (JSC::DFG::LivenessAnalysisPhase::processBlock): * dfg/DFGNode.cpp: * dfg/DFGNode.h: * dfg/DFGObjectAllocationSinkingPhase.cpp: Source/WTF: This adds LoggingHashSet and LoggingHashMap, which are drop-in replacements for HashSet and HashMap that log everything that they do, so that you can replay it later. This also adds a benchmark (HashSetDFGReplay) based on doing a recording of some of the HashSets in the DFG compiler. * WTF.xcodeproj/project.pbxproj: * benchmarks/HashSetDFGReplay.cpp: Added. (benchmark): (main): * wtf/CMakeLists.txt: * wtf/GlobalVersion.cpp: Added. (WTF::newGlobalVersion): * wtf/GlobalVersion.h: Added. * wtf/HashMap.h: (WTF::X>::swap): * wtf/HashSet.h: (WTF::V>::addVoid): * wtf/LoggingHashID.h: Added. (WTF::LoggingHashID::LoggingHashID): (WTF::LoggingHashID::dump): * wtf/LoggingHashMap.h: Added. * wtf/LoggingHashSet.h: Added. * wtf/LoggingHashTraits.h: Added. (WTF::LoggingHashKeyTraits::print): (WTF::LoggingHashValueTraits::print): Canonical link: https://commits.webkit.org/186623@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213939 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-14 21:37:41 +00:00
/*
* Copyright (C) 2017 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. ``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
* 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
#include <wtf/DataLog.h>
#include <wtf/HashSet.h>
#include <wtf/LoggingHashID.h>
#include <wtf/LoggingHashTraits.h>
namespace WTF {
template<
const char* typeArguments,
[WTF] Remove the unnecessary inner class DefaultHash<T>::Hash https://bugs.webkit.org/show_bug.cgi?id=214389 Reviewed by Darin Adler. Source/JavaScriptCore: * assembler/MacroAssemblerCodeRef.h: * b3/B3CheckSpecial.h: * b3/B3Kind.h: * b3/B3ValueKey.h: * b3/air/AirAllocateRegistersByGraphColoring.cpp: * b3/air/AirArg.h: * b3/air/AirTmp.h: * bytecode/BytecodeIndex.h: * bytecode/CallVariant.h: * bytecode/CodeOrigin.h: * bytecode/DFGExitProfile.h: * bytecode/LazyOperandValueProfile.h: * bytecode/ObjectPropertyCondition.h: * bytecode/PropertyCondition.h: * dfg/DFGAbstractHeap.h: * dfg/DFGArgumentsEliminationPhase.cpp: * dfg/DFGByteCodeParser.cpp: * dfg/DFGCSEPhase.cpp: * dfg/DFGCompilationKey.h: * dfg/DFGDesiredGlobalProperty.h: * dfg/DFGHeapLocation.h: * dfg/DFGLivenessAnalysisPhase.cpp: * dfg/DFGMinifiedID.h: * dfg/DFGNodeFlowProjection.h: * dfg/DFGPromotedHeapLocation.h: * dfg/DFGPropertyTypeKey.h: * dfg/DFGPureValue.h: * ftl/FTLLocation.h: * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSpread): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): * ftl/FTLSlowPathCallKey.h: * heap/MarkedBlock.h: * heap/VisitRaceKey.h: * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: * inspector/scripts/tests/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/expected/enum-values.json-result: * inspector/scripts/tests/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result: * jit/ICStats.h: * jit/JITThunks.h: * jit/Reg.h: * jit/RegisterSet.h: * parser/VariableEnvironment.h: * profiler/ProfilerOrigin.h: * profiler/ProfilerOriginStack.h: * profiler/ProfilerUID.h: * runtime/CachedTypes.cpp: * runtime/ControlFlowProfiler.h: * runtime/NativeFunction.h: * runtime/PrototypeKey.h: * runtime/RegExpKey.h: * runtime/TemplateObjectDescriptor.h: * runtime/TypeProfiler.h: * runtime/VarOffset.h: * runtime/WeakGCMap.h: * wasm/WasmBBQPlan.h: * wasm/WasmCodeBlock.h: * wasm/WasmEntryPlan.h: * wasm/WasmLLIntPlan.h: * wasm/WasmSignature.h: Source/WebCore: * Modules/indexeddb/IDBDatabaseIdentifier.h: * Modules/indexeddb/shared/IDBResourceIdentifier.h: * Modules/webgpu/WHLSL/AST/WHLSLUnnamedTypeHash.h: * Modules/webgpu/WHLSL/WHLSLSemanticMatcher.cpp: (WebCore::WHLSL::matchResources): (WebCore::WHLSL::matchVertexAttributes): (WebCore::WHLSL::matchColorAttachments): * accessibility/AccessibilityObject.cpp: * accessibility/AccessibilityObject.h: * contentextensions/ContentExtensionCompiler.cpp: (WebCore::ContentExtensions::serializeActions): * contentextensions/ContentExtensionRule.h: (WebCore::ContentExtensions::TriggerHash::hash): * contentextensions/ContentExtensionStyleSheet.h: * contentextensions/DFA.cpp: (WebCore::ContentExtensions::printTransitions): * contentextensions/DFABytecodeInterpreter.h: * contentextensions/DFACombiner.cpp: (WebCore::ContentExtensions::DFAMerger::getOrCreateCombinedNode): * contentextensions/DFANode.cpp: (WebCore::ContentExtensions::DFANode::bestFallbackTarget const): * contentextensions/ImmutableNFANodeBuilder.h: * contentextensions/NFA.cpp: (WebCore::ContentExtensions::NFA::debugPrintDot const): * contentextensions/NFANode.h: * contentextensions/NFAToDFA.cpp: (WebCore::ContentExtensions::NodeIdSetToUniqueNodeIdSetSource::NodeIdSetToUniqueNodeIdSetSource): (WebCore::ContentExtensions::NodeIdSetToUniqueNodeIdSetTranslator::translate): * css/makeprop.pl: * css/parser/CSSParserContext.h: * dom/GCReachableRef.h: * dom/MessagePortIdentifier.h: * dom/NodeRareData.h: (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::hash): (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::equal): * dom/QualifiedName.h: * history/BackForwardItemIdentifier.h: * html/canvas/WebGLRenderingContextBase.h: * layout/LayoutUnits.h: * loader/AdClickAttribution.h: * loader/ResourceCryptographicDigest.h: (WTF::DefaultHash<WebCore::ResourceCryptographicDigest>::hash): (WTF::DefaultHash<WebCore::ResourceCryptographicDigest>::equal): (WTF::DefaultHash<WebCore::ResourceCryptographicDigest>::Hash::hash): Deleted. (WTF::DefaultHash<WebCore::ResourceCryptographicDigest>::Hash::equal): Deleted. * page/ClientOrigin.h: * page/GlobalWindowIdentifier.h: * page/SecurityOriginData.h: * page/SecurityOriginHash.h: * platform/Cookie.h: * platform/RegistrableDomain.h: * platform/graphics/ColorHash.h: * platform/graphics/FloatSizeHash.h: (WTF::FloatHash<WebCore::FloatSize>::hash): * platform/graphics/FontGenericFamilies.h: * platform/graphics/IntPointHash.h: * platform/graphics/IntRectHash.h: (WTF::IntHash<WebCore::IntRect>::hash): (WTF::IntHash<WebCore::IntRect>::equal): * platform/graphics/IntSizeHash.h: * platform/graphics/WidthCache.h: * platform/graphics/freetype/FontCacheFreeType.cpp: (WebCore::FallbackFontDescriptionKey::computeHash const): * platform/network/HTTPParsers.h: * platform/network/ProtectionSpaceHash.h: * platform/win/COMPtr.h: * platform/win/WindowsKeyNames.h: * rendering/CSSValueKey.h: * rendering/GridBaselineAlignment.h: * rendering/GridTrackSizingAlgorithm.h: * rendering/RenderGrid.cpp: (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const): * rendering/RenderTheme.h: * style/RuleSet.cpp: (WebCore::Style::RuleSet::evaluateDynamicMediaQueryRules): * svg/SVGElement.h: (WebCore::SVGAttributeHashTranslator::hash): * workers/service/ServiceWorkerClientIdentifier.h: * workers/service/ServiceWorkerRegistrationKey.h: Source/WebCore/PAL: * pal/SessionID.h: Source/WebKit: * NetworkProcess/Downloads/DownloadID.h: * NetworkProcess/cache/NetworkCache.h: * NetworkProcess/cache/NetworkCacheKey.h: * Platform/IPC/MessageReceiverMap.h: * Platform/IPC/StringReference.h: * Shared/CallbackID.h: * UIProcess/API/cpp/WKRetainPtr.h: Source/WebKitLegacy/win: * COMPropertyBag.h: Source/WTF: DefaultHash<T> doesn't need to have a inner struct Hash. This can be a problem for forward declarations (Bug 214320 Comment 5). * wtf/BitVector.h: * wtf/Forward.h: * wtf/HashFunctions.h: (WTF::PairHash::hash): (WTF::PairHash::equal): (WTF::TupleHash::hash): (WTF::TupleHash::equal): * wtf/ListHashSet.h: * wtf/LoggingHashMap.h: * wtf/LoggingHashSet.h: * wtf/MetaAllocatorPtr.h: * wtf/ObjectIdentifier.h: * wtf/OptionSetHash.h: (WTF::DefaultHash<OptionSet<T>>::hash): (WTF::DefaultHash<OptionSet<T>>::equal): (WTF::DefaultHash<OptionSet<T>>::Hash::hash): Deleted. (WTF::DefaultHash<OptionSet<T>>::Hash::equal): Deleted. * wtf/Packed.h: * wtf/RetainPtr.h: * wtf/StackShot.h: * wtf/URLHash.h: * wtf/VectorHash.h: (WTF::VectorHash::hash): * wtf/text/AtomString.h: * wtf/text/AtomStringHash.h: * wtf/text/CString.h: * wtf/text/StringHash.h: * wtf/text/StringImpl.h: * wtf/text/SymbolRegistry.h: (WTF::DefaultHash<SymbolRegistryKey>::hash): (WTF::DefaultHash<SymbolRegistryKey>::equal): (WTF::DefaultHash<SymbolRegistryKey>::Hash::hash): Deleted. (WTF::DefaultHash<SymbolRegistryKey>::Hash::equal): Deleted. * wtf/text/WTFString.h: Tools: * TestWebKitAPI/Tests/WTF/DeletedAddressOfOperator.h: (WTF::DefaultHash<DeletedAddressOfOperator>::hash): (WTF::DefaultHash<DeletedAddressOfOperator>::equal): (WTF::DefaultHash<DeletedAddressOfOperator>::Hash::hash): Deleted. (WTF::DefaultHash<DeletedAddressOfOperator>::Hash::equal): Deleted. * TestWebKitAPI/Tests/WTF/HashCountedSet.cpp: (TestWebKitAPI::bucketForKey): * TestWebKitAPI/Tests/WTF/HashMap.cpp: (TestWebKitAPI::bucketForKey): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/HashSet.cpp: (TestWebKitAPI::testInitialCapacity): * TestWebKitAPI/Tests/WTF/MoveOnly.h: (WTF::DefaultHash<MoveOnly>::hash): (WTF::DefaultHash<MoveOnly>::equal): (WTF::DefaultHash<MoveOnly>::Hash::hash): Deleted. (WTF::DefaultHash<MoveOnly>::Hash::equal): Deleted. Canonical link: https://commits.webkit.org/227236@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@264488 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-07-17 00:33:37 +00:00
typename ValueArg, typename HashArg = DefaultHash<ValueArg>,
Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark https://bugs.webkit.org/show_bug.cgi?id=169590 Reviewed by Saam Barati. Source/JavaScriptCore: Adds code to support logging some hashtable stuff in the DFG. * dfg/DFGAvailabilityMap.cpp: (JSC::DFG::AvailabilityMap::pruneHeap): * dfg/DFGCombinedLiveness.cpp: (JSC::DFG::liveNodesAtHead): (JSC::DFG::CombinedLiveness::CombinedLiveness): * dfg/DFGCombinedLiveness.h: * dfg/DFGLivenessAnalysisPhase.cpp: (JSC::DFG::LivenessAnalysisPhase::run): (JSC::DFG::LivenessAnalysisPhase::processBlock): * dfg/DFGNode.cpp: * dfg/DFGNode.h: * dfg/DFGObjectAllocationSinkingPhase.cpp: Source/WTF: This adds LoggingHashSet and LoggingHashMap, which are drop-in replacements for HashSet and HashMap that log everything that they do, so that you can replay it later. This also adds a benchmark (HashSetDFGReplay) based on doing a recording of some of the HashSets in the DFG compiler. * WTF.xcodeproj/project.pbxproj: * benchmarks/HashSetDFGReplay.cpp: Added. (benchmark): (main): * wtf/CMakeLists.txt: * wtf/GlobalVersion.cpp: Added. (WTF::newGlobalVersion): * wtf/GlobalVersion.h: Added. * wtf/HashMap.h: (WTF::X>::swap): * wtf/HashSet.h: (WTF::V>::addVoid): * wtf/LoggingHashID.h: Added. (WTF::LoggingHashID::LoggingHashID): (WTF::LoggingHashID::dump): * wtf/LoggingHashMap.h: Added. * wtf/LoggingHashSet.h: Added. * wtf/LoggingHashTraits.h: Added. (WTF::LoggingHashKeyTraits::print): (WTF::LoggingHashValueTraits::print): Canonical link: https://commits.webkit.org/186623@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213939 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-14 21:37:41 +00:00
typename TraitsArg = HashTraits<ValueArg>,
typename LoggingTraits = LoggingHashKeyTraits<ValueArg>>
class LoggingHashSet final {
WTF_MAKE_FAST_ALLOCATED;
typedef TraitsArg ValueTraits;
typedef typename ValueTraits::TakeType TakeType;
public:
typedef WTF::HashSet<ValueArg, HashArg, TraitsArg> HashSet;
typedef typename HashSet::ValueType ValueType;
typedef typename HashSet::iterator iterator;
typedef typename HashSet::const_iterator const_iterator;
typedef typename HashSet::AddResult AddResult;
LoggingHashSet()
{
dataLog("auto* ", m_id, " = new HashSet<", typeArguments, ">();\n");
}
~LoggingHashSet()
{
dataLog("delete ", m_id, ";\n");
}
LoggingHashSet(const LoggingHashSet& other)
: m_set(other.m_set)
{
dataLog("auto* ", m_id, " = new HashSet<", typeArguments, ">(*", other.m_id, ");\n");
}
LoggingHashSet(LoggingHashSet&& other)
: m_set(other.m_set)
{
dataLog("auto* ", m_id, " = new HashSet<", typeArguments, ">(WTFMove(*", other.m_id, "));\n");
}
LoggingHashSet& operator=(const LoggingHashSet& other)
{
dataLog("*", m_id, " = *", other.m_id, ";\n");
m_set = other.m_set;
return *this;
}
LoggingHashSet& operator=(LoggingHashSet&& other)
{
dataLog("*", m_id, " = WTFMove(*", other.m_id, ");\n");
m_set = WTFMove(other.m_set);
return *this;
}
void swap(LoggingHashSet& other)
{
dataLog(m_id, "->swap(*", other.m_id, ");\n");
m_set.swap(other.m_set);
}
unsigned size() const { return m_set.size(); }
unsigned capacity() const { return m_set.capacity(); }
bool isEmpty() const { return m_set.isEmpty(); }
iterator begin() const { return m_set.begin(); }
iterator end() const { return m_set.end(); }
HashMap should support selecting a random entry https://bugs.webkit.org/show_bug.cgi?id=190814 Reviewed by Antti Koivisto. Source/WTF: In some cases, remove(begin()) is not quite good enough as a random eviction strategy. (See https://bugs.webkit.org/show_bug.cgi?id=190792.) So, let's support real random eviction. (And by "real" I mean "pseudo".) * wtf/HashCountedSet.h: * wtf/HashMap.h: * wtf/HashSet.h: * wtf/ListHashSet.h: (WTF::ListHashSet::random): (WTF::ListHashSet::random const): * wtf/LoggingHashMap.h: * wtf/LoggingHashSet.h: Plumb through the random() iterator. * wtf/HashTable.h: (WTF::HashTable::random): (WTF::HashTable::random const): Implement the random() iterator. makeIterator() already supports starting from any bucket, so this is pretty easy. In the subtle case where we select end(), we choose to wrap around and return begin(). We expect that clients don't really think of the end() bucket as being in the domain of the random search. Also, we don't want to annoy clients who know their tables are non-empty with needless checks for end(). * wtf/RandomNumber.cpp: (WTF::weakRandomUint32): * wtf/RandomNumber.h: Added a free function for weak random numbers so that clients that want cheap random numbers aren't required to allocate storage for a WeakRandom generator. Tools: Unit testing is fun and easy! * TestWebKitAPI/Tests/WTF/HashMap.cpp: (TestWebKitAPI::ZeroHash::hash): (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/205760@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237419 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-10-25 17:41:35 +00:00
iterator random() { return m_set.random(); }
const_iterator random() const { return m_set.random(); }
Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark https://bugs.webkit.org/show_bug.cgi?id=169590 Reviewed by Saam Barati. Source/JavaScriptCore: Adds code to support logging some hashtable stuff in the DFG. * dfg/DFGAvailabilityMap.cpp: (JSC::DFG::AvailabilityMap::pruneHeap): * dfg/DFGCombinedLiveness.cpp: (JSC::DFG::liveNodesAtHead): (JSC::DFG::CombinedLiveness::CombinedLiveness): * dfg/DFGCombinedLiveness.h: * dfg/DFGLivenessAnalysisPhase.cpp: (JSC::DFG::LivenessAnalysisPhase::run): (JSC::DFG::LivenessAnalysisPhase::processBlock): * dfg/DFGNode.cpp: * dfg/DFGNode.h: * dfg/DFGObjectAllocationSinkingPhase.cpp: Source/WTF: This adds LoggingHashSet and LoggingHashMap, which are drop-in replacements for HashSet and HashMap that log everything that they do, so that you can replay it later. This also adds a benchmark (HashSetDFGReplay) based on doing a recording of some of the HashSets in the DFG compiler. * WTF.xcodeproj/project.pbxproj: * benchmarks/HashSetDFGReplay.cpp: Added. (benchmark): (main): * wtf/CMakeLists.txt: * wtf/GlobalVersion.cpp: Added. (WTF::newGlobalVersion): * wtf/GlobalVersion.h: Added. * wtf/HashMap.h: (WTF::X>::swap): * wtf/HashSet.h: (WTF::V>::addVoid): * wtf/LoggingHashID.h: Added. (WTF::LoggingHashID::LoggingHashID): (WTF::LoggingHashID::dump): * wtf/LoggingHashMap.h: Added. * wtf/LoggingHashSet.h: Added. * wtf/LoggingHashTraits.h: Added. (WTF::LoggingHashKeyTraits::print): (WTF::LoggingHashValueTraits::print): Canonical link: https://commits.webkit.org/186623@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213939 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-14 21:37:41 +00:00
iterator find(const ValueType& value) const
{
StringPrintStream string;
string.print("{\n");
string.print(" auto iter = ", m_id, "->find(");
LoggingTraits::print(string, value);
string.print(");\n");
iterator result = m_set.find(value);
if (result == m_set.end())
string.print(" RELEASE_ASSERT(iter == ", m_id, "->end());\n");
else
string.print(" RELEASE_ASSERT(iter != ", m_id, "->end());\n");
string.print("}\n");
dataLog(string.toCString());
return result;
}
bool contains(const ValueType& value) const
{
return find(value) != end();
}
// FIXME: Implement the translator versions of find() and friends.
AddResult add(const ValueType& value)
{
StringPrintStream string;
string.print(m_id, "->add(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
return m_set.add(value);
}
AddResult add(ValueType&& value)
{
StringPrintStream string;
string.print(m_id, "->add(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
return m_set.add(WTFMove(value));
}
void addVoid(const ValueType& value)
{
StringPrintStream string;
string.print(m_id, "->addVoid(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
m_set.addVoid(value);
}
void addVoid(ValueType&& value)
{
StringPrintStream string;
string.print(m_id, "->addVoid(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
m_set.addVoid(WTFMove(value));
}
template<typename IteratorType>
bool add(IteratorType begin, IteratorType end)
{
bool changed = false;
for (IteratorType iter = begin; iter != end; ++iter)
changed |= add(*iter).isNewEntry;
return changed;
}
bool remove(iterator iter)
{
// FIXME: We should do much better than this!
if (iter == end())
return false;
return remove(*iter);
}
bool remove(const ValueType& value)
{
StringPrintStream string;
string.print(m_id, "->remove(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
return m_set.remove(value);
}
// FIXME: Implement removeIf
void clear()
{
dataLog(m_id, "->clear();\n");
m_set.clear();
}
TakeType take(const ValueType& value)
{
StringPrintStream string;
string.print(m_id, "->remove(");
LoggingTraits::print(string, value);
string.print(");\n");
dataLog(string.toCString());
return m_set.take(value);
}
TakeType take(iterator iter)
{
return take(*iter);
}
TakeType takeAny()
{
dataLog(m_id, "->takeAny();\n");
return m_set.takeAny();
}
template<typename OtherCollection>
bool operator==(const OtherCollection& otherCollection) const
{
if (size() != otherCollection.size())
return false;
for (const auto& other : otherCollection) {
if (!contains(other))
return false;
}
return true;
}
template<typename OtherCollection>
bool operator!=(const OtherCollection& other) const
{
return !(*this == other);
}
private:
HashSet m_set;
LoggingHashID m_id;
};
} // namespace WTF
using WTF::LoggingHashSet;