Index: Source/platform/heap/HeapTest.cpp |
diff --git a/Source/platform/heap/HeapTest.cpp b/Source/platform/heap/HeapTest.cpp |
index 5ea59099b96519d817d6cc9f67d9fc28d19215a2..6d2d8f476212aa54262e05ad0ada68f602ec7bc5 100644 |
--- a/Source/platform/heap/HeapTest.cpp |
+++ b/Source/platform/heap/HeapTest.cpp |
@@ -1894,6 +1894,7 @@ public: |
HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map; |
HeapHashSet<Member<IntWrapper> > set; |
HeapHashSet<Member<IntWrapper> > set2; |
+ HeapHashCountedSet<Member<IntWrapper> > set3; |
HeapVector<Member<IntWrapper>, 2> vector; |
HeapVector<PairWrappedUnwrapped, 2> vectorWU; |
HeapVector<PairUnwrappedWrapped, 2> vectorUW; |
@@ -1905,6 +1906,7 @@ public: |
visitor->trace(map); |
visitor->trace(set); |
visitor->trace(set2); |
+ visitor->trace(set3); |
visitor->trace(vector); |
visitor->trace(vectorWU); |
visitor->trace(vectorUW); |
@@ -2122,6 +2124,7 @@ TEST(HeapTest, HeapCollectionTypes) |
typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; |
typedef HeapHashSet<Member<IntWrapper> > MemberSet; |
+ typedef HeapHashCountedSet<Member<IntWrapper> > MemberCountedSet; |
typedef HeapVector<Member<IntWrapper>, 2> MemberVector; |
typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque; |
@@ -2138,6 +2141,7 @@ TEST(HeapTest, HeapCollectionTypes) |
Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember(); |
Persistent<MemberSet> set = new MemberSet(); |
Persistent<MemberSet> set2 = new MemberSet(); |
+ Persistent<MemberCountedSet> set3 = new MemberCountedSet(); |
Persistent<MemberVector> vector = new MemberVector(); |
Persistent<MemberVector> vector2 = new MemberVector(); |
Persistent<VectorWU> vectorWU = new VectorWU(); |
@@ -2198,6 +2202,8 @@ TEST(HeapTest, HeapCollectionTypes) |
set2->add(three); |
set2->add(four); |
set->add(oneB); |
+ set3->add(oneB); |
+ set3->add(oneB); |
vector->append(oneB); |
deque->append(oneB); |
vector2->append(threeB); |
@@ -2235,6 +2241,7 @@ TEST(HeapTest, HeapCollectionTypes) |
EXPECT_EQ(4u, memberPrimitive->size()); |
EXPECT_EQ(1u, set->size()); |
EXPECT_EQ(4u, set2->size()); |
+ EXPECT_EQ(1u, set3->size()); |
EXPECT_EQ(1u, vector->size()); |
EXPECT_EQ(2u, vector2->size()); |
EXPECT_EQ(1u, vectorWU->size()); |
@@ -2287,6 +2294,11 @@ TEST(HeapTest, HeapCollectionTypes) |
cset1.swap(cset2); |
cset2.swap(set2); |
+ MemberCountedSet& cCountedSet = container->set3; |
+ set3->swap(cCountedSet); |
+ EXPECT_EQ(0u, set3->size()); |
+ set3->swap(cCountedSet); |
+ |
// Triple swap. |
container->map.swap(memberMember2); |
MemberMember& containedMap = container->map; |
@@ -2310,6 +2322,7 @@ TEST(HeapTest, HeapCollectionTypes) |
EXPECT_TRUE(set->contains(three)); |
EXPECT_TRUE(set->contains(four)); |
EXPECT_TRUE(set2->contains(oneB)); |
+ EXPECT_TRUE(set3->contains(oneB)); |
EXPECT_TRUE(vector->contains(threeB)); |
EXPECT_TRUE(vector->contains(fourB)); |
EXPECT_TRUE(dequeContains(*deque, threeE)); |
@@ -2348,6 +2361,7 @@ TEST(HeapTest, HeapCollectionTypes) |
EXPECT_EQ(4u, memberPrimitive->size()); |
EXPECT_EQ(4u, set->size()); |
EXPECT_EQ(1u, set2->size()); |
+ EXPECT_EQ(1u, set3->size()); |
EXPECT_EQ(2u, vector->size()); |
EXPECT_EQ(1u, vector2->size()); |
EXPECT_EQ(3u, vectorUW->size()); |
@@ -2366,6 +2380,8 @@ TEST(HeapTest, HeapCollectionTypes) |
EXPECT_TRUE(set->contains(two)); |
EXPECT_FALSE(set->contains(oneB)); |
EXPECT_TRUE(set2->contains(oneB)); |
+ EXPECT_TRUE(set3->contains(oneB)); |
+ EXPECT_EQ(2u, set3->find(oneB)->value); |
EXPECT_EQ(3, vector->at(0)->value()); |
EXPECT_EQ(4, vector->at(1)->value()); |
EXPECT_EQ(3, deque->begin()->get()->value()); |
@@ -2433,11 +2449,13 @@ TEST(HeapTest, HeapWeakCollectionSimple) |
typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; |
typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWeak; |
typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; |
+ typedef HeapHashCountedSet<WeakMember<IntWrapper> > WeakCountedSet; |
Persistent<WeakStrong> weakStrong = new WeakStrong(); |
Persistent<StrongWeak> strongWeak = new StrongWeak(); |
Persistent<WeakWeak> weakWeak = new WeakWeak(); |
Persistent<WeakSet> weakSet = new WeakSet(); |
+ Persistent<WeakCountedSet> weakCountedSet = new WeakCountedSet(); |
Persistent<IntWrapper> two = IntWrapper::create(2); |
@@ -2453,10 +2471,20 @@ TEST(HeapTest, HeapWeakCollectionSimple) |
weakSet->add(two); |
weakSet->add(keepNumbersAlive[0]); |
weakSet->add(keepNumbersAlive[1]); |
+ weakCountedSet->add(IntWrapper::create(0)); |
+ weakCountedSet->add(two); |
+ weakCountedSet->add(two); |
+ weakCountedSet->add(two); |
+ weakCountedSet->add(keepNumbersAlive[0]); |
+ weakCountedSet->add(keepNumbersAlive[1]); |
EXPECT_EQ(1u, weakStrong->size()); |
EXPECT_EQ(1u, strongWeak->size()); |
EXPECT_EQ(2u, weakWeak->size()); |
EXPECT_EQ(4u, weakSet->size()); |
+ EXPECT_EQ(4u, weakCountedSet->size()); |
+ EXPECT_EQ(3u, weakCountedSet->find(two)->value); |
+ weakCountedSet->remove(two); |
+ EXPECT_EQ(2u, weakCountedSet->find(two)->value); |
} |
keepNumbersAlive[0] = nullptr; |
@@ -2467,6 +2495,7 @@ TEST(HeapTest, HeapWeakCollectionSimple) |
EXPECT_EQ(0u, strongWeak->size()); |
EXPECT_EQ(0u, weakWeak->size()); |
EXPECT_EQ(2u, weakSet->size()); |
+ EXPECT_EQ(2u, weakCountedSet->size()); |
} |
template<typename Set> |
@@ -2718,29 +2747,50 @@ typedef HeapHashSet<PairWeakStrong> WeakStrongSet; |
typedef HeapHashSet<PairWeakUnwrapped> WeakUnwrappedSet; |
typedef HeapHashSet<PairStrongWeak> StrongWeakSet; |
typedef HeapHashSet<PairUnwrappedWeak> UnwrappedWeakSet; |
+typedef HeapLinkedHashSet<PairWeakStrong> WeakStrongLinkedSet; |
+typedef HeapLinkedHashSet<PairWeakUnwrapped> WeakUnwrappedLinkedSet; |
+typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakLinkedSet; |
+typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakLinkedSet; |
+typedef HeapHashCountedSet<PairWeakStrong> WeakStrongCountedSet; |
+typedef HeapHashCountedSet<PairWeakUnwrapped> WeakUnwrappedCountedSet; |
+typedef HeapHashCountedSet<PairStrongWeak> StrongWeakCountedSet; |
+typedef HeapHashCountedSet<PairUnwrappedWeak> UnwrappedWeakCountedSet; |
+ |
+template<typename T> |
+T& iteratorExtractor(WTF::KeyValuePair<T, unsigned>& pair) |
+{ |
+ return pair.key; |
+} |
+ |
+template<typename T> |
+T& iteratorExtractor(T& notAPair) |
+{ |
+ return notAPair; |
+} |
+template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> |
void checkPairSets( |
- Persistent<WeakStrongSet>& weakStrong, |
- Persistent<StrongWeakSet>& strongWeak, |
- Persistent<WeakUnwrappedSet>& weakUnwrapped, |
- Persistent<UnwrappedWeakSet>& unwrappedWeak, |
+ Persistent<WSSet>& weakStrong, |
+ Persistent<SWSet>& strongWeak, |
+ Persistent<WUSet>& weakUnwrapped, |
+ Persistent<UWSet>& unwrappedWeak, |
bool ones, |
Persistent<IntWrapper>& two) |
{ |
- WeakStrongSet::iterator itWS = weakStrong->begin(); |
- StrongWeakSet::iterator itSW = strongWeak->begin(); |
- WeakUnwrappedSet::iterator itWU = weakUnwrapped->begin(); |
- UnwrappedWeakSet::iterator itUW = unwrappedWeak->begin(); |
+ typename WSSet::iterator itWS = weakStrong->begin(); |
+ typename SWSet::iterator itSW = strongWeak->begin(); |
+ typename WUSet::iterator itWU = weakUnwrapped->begin(); |
+ typename UWSet::iterator itUW = unwrappedWeak->begin(); |
EXPECT_EQ(2u, weakStrong->size()); |
EXPECT_EQ(2u, strongWeak->size()); |
EXPECT_EQ(2u, weakUnwrapped->size()); |
EXPECT_EQ(2u, unwrappedWeak->size()); |
- PairWeakStrong p = *itWS; |
- PairStrongWeak p2 = *itSW; |
- PairWeakUnwrapped p3 = *itWU; |
- PairUnwrappedWeak p4 = *itUW; |
+ PairWeakStrong p = iteratorExtractor(*itWS); |
+ PairStrongWeak p2 = iteratorExtractor(*itSW); |
+ PairWeakUnwrapped p3 = iteratorExtractor(*itWU); |
+ PairUnwrappedWeak p4 = iteratorExtractor(*itUW); |
if (p.first == two && p.second == two) |
++itWS; |
if (p2.first == two && p2.second == two) |
@@ -2749,10 +2799,10 @@ void checkPairSets( |
++itWU; |
if (p4.first == 2 && p4.second == two) |
++itUW; |
- p = *itWS; |
- p2 = *itSW; |
- p3 = *itWU; |
- p4 = *itUW; |
+ p = iteratorExtractor(*itWS); |
+ p2 = iteratorExtractor(*itSW); |
+ p3 = iteratorExtractor(*itWU); |
+ p4 = iteratorExtractor(*itUW); |
IntWrapper* nullWrapper = 0; |
if (ones) { |
EXPECT_EQ(p.first->value(), 1); |
@@ -2777,16 +2827,17 @@ void checkPairSets( |
EXPECT_TRUE(unwrappedWeak->contains(PairUnwrappedWeak(2, &*two))); |
} |
-TEST(HeapTest, HeapWeakPairs) |
+template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> |
+void heapWeakPairsHelper() |
{ |
IntWrapper::s_destructorCalls = 0; |
PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; |
- Persistent<WeakStrongSet> weakStrong = new WeakStrongSet(); |
- Persistent<StrongWeakSet> strongWeak = new StrongWeakSet(); |
- Persistent<WeakUnwrappedSet> weakUnwrapped = new WeakUnwrappedSet(); |
- Persistent<UnwrappedWeakSet> unwrappedWeak = new UnwrappedWeakSet(); |
+ Persistent<WSSet> weakStrong = new WSSet(); |
+ Persistent<SWSet> strongWeak = new SWSet(); |
+ Persistent<WUSet> weakUnwrapped = new WUSet(); |
+ Persistent<UWSet> unwrappedWeak = new UWSet(); |
Persistent<IntWrapper> two = IntWrapper::create(2); |
@@ -2805,6 +2856,13 @@ TEST(HeapTest, HeapWeakPairs) |
checkPairSets(weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, false, two); |
} |
+TEST(HeapTest, HeapWeakPairs) |
+{ |
+ heapWeakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, UnwrappedWeakSet>(); |
+ heapWeakPairsHelper<WeakStrongCountedSet, StrongWeakCountedSet, WeakUnwrappedCountedSet, UnwrappedWeakCountedSet>(); |
+ heapWeakPairsHelper<WeakStrongLinkedSet, StrongWeakLinkedSet, WeakUnwrappedLinkedSet, UnwrappedWeakLinkedSet>(); |
+} |
+ |
TEST(HeapTest, HeapWeakCollectionTypes) |
{ |
HeapStats initialHeapSize; |