Commit 88e648f7 authored by Bartek Nowierski's avatar Bartek Nowierski Committed by Commit Bot

Migrate users of LinkedHashSet to NewLinkedHashSet

The migration is done by renaming LinkedHashSet->LegacyLinkedHashSet
and NewLinkedHashSet->LinkedHashSet. In case of OrderedTrackIndexSet
(in grid.h) adding custom hash traits is required too.

The CL results in a binary size increase due to inlined code related to
VectorBackedLinkedList, which does not exist in LegacyLinkedHashSet.

Co-author: keinakashima@chromium.org
Significant contributor: yukiy@chromium.org

Bug: 1100257
Change-Id: Ieefb3fa8cd27110872aba932370b84dcfe41c8a4
Binary-Size: Size increase is unavoidable (see above).
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2134039Reviewed-by: default avatarOmer Katz <omerkatz@chromium.org>
Reviewed-by: default avatarYuki Yamada <yukiy@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarYuki Shiino <yukishiino@chromium.org>
Commit-Queue: Bartek Nowierski <bartekn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800903}
parent 4774e605
...@@ -17,9 +17,20 @@ ...@@ -17,9 +17,20 @@
namespace blink { namespace blink {
struct OrderedTrackIndexSetHashTraits : public HashTraits<size_t> {
static const bool kEmptyValueIsZero = false;
static size_t EmptyValue() { return UINT_MAX; }
static void ConstructDeletedValue(size_t& slot, bool) { slot = UINT_MAX - 1; }
static bool IsDeletedValue(const size_t& value) {
return value == UINT_MAX - 1;
}
};
// TODO(svillar): Perhaps we should use references here. // TODO(svillar): Perhaps we should use references here.
typedef Vector<LayoutBox*, 1> GridItemList; typedef Vector<LayoutBox*, 1> GridItemList;
typedef LinkedHashSet<size_t> OrderedTrackIndexSet; typedef LinkedHashSet<size_t, OrderedTrackIndexSetHashTraits>
OrderedTrackIndexSet;
class LayoutGrid; class LayoutGrid;
class GridIterator; class GridIterator;
...@@ -62,7 +73,6 @@ class CORE_EXPORT Grid { ...@@ -62,7 +73,6 @@ class CORE_EXPORT Grid {
size_t AutoRepeatTracks(GridTrackSizingDirection) const; size_t AutoRepeatTracks(GridTrackSizingDirection) const;
void SetAutoRepeatTracks(size_t auto_repeat_rows, size_t auto_repeat_columns); void SetAutoRepeatTracks(size_t auto_repeat_rows, size_t auto_repeat_columns);
typedef LinkedHashSet<size_t> OrderedTrackIndexSet;
void SetAutoRepeatEmptyColumns(std::unique_ptr<OrderedTrackIndexSet>); void SetAutoRepeatEmptyColumns(std::unique_ptr<OrderedTrackIndexSet>);
void SetAutoRepeatEmptyRows(std::unique_ptr<OrderedTrackIndexSet>); void SetAutoRepeatEmptyRows(std::unique_ptr<OrderedTrackIndexSet>);
......
...@@ -474,79 +474,81 @@ template <typename T, typename U, typename V> ...@@ -474,79 +474,81 @@ template <typename T, typename U, typename V>
struct GCInfoTrait<HeapHashSet<T, U, V>> struct GCInfoTrait<HeapHashSet<T, U, V>>
: public GCInfoTrait<HashSet<T, U, V, HeapAllocator>> {}; : public GCInfoTrait<HashSet<T, U, V, HeapAllocator>> {};
// IMPORTANT! Do not use this class, unless you need to work around a
// HeapLinkedHashSet issue. Contact chrome-memory-tok@ if you do.
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
template <typename ValueArg, template <typename ValueArg,
typename HashArg = typename DefaultHash<ValueArg>::Hash, typename HashArg = typename DefaultHash<ValueArg>::Hash,
typename TraitsArg = HashTraits<ValueArg>> typename TraitsArg = HashTraits<ValueArg>>
class HeapLinkedHashSet class HeapLegacyLinkedHashSet
: public LinkedHashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> { : public LegacyLinkedHashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> {
IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); IS_GARBAGE_COLLECTED_CONTAINER_TYPE();
DISALLOW_NEW(); DISALLOW_NEW();
// HeapLinkedHashSet is using custom callbacks for compaction that rely on the // HeapLegacyLinkedHashSet is using custom callbacks for compaction that rely
// fact that the container itself does not move. // on the fact that the container itself does not move.
DISALLOW_IN_CONTAINER(); DISALLOW_IN_CONTAINER();
static void CheckType() { static void CheckType() {
static_assert(internal::IsMemberOrWeakMemberType<ValueArg>, static_assert(
"HeapLinkedHashSet supports only Member and WeakMember."); internal::IsMemberOrWeakMemberType<ValueArg>,
"HeapLegacyLinkedHashSet supports only Member and WeakMember.");
static_assert( static_assert(
IsAllowedInContainer<ValueArg>::value, IsAllowedInContainer<ValueArg>::value,
"Not allowed to directly nest type. Use Member<> indirection instead."); "Not allowed to directly nest type. Use Member<> indirection instead.");
static_assert(WTF::IsTraceable<ValueArg>::value, static_assert(
"For sets without traceable elements, use LinkedHashSet<> " WTF::IsTraceable<ValueArg>::value,
"instead of HeapLinkedHashSet<>."); "For sets without traceable elements, use LegacyLinkedHashSet<> "
"instead of HeapLegacyLinkedHashSet<>.");
} }
public: public:
template <typename> template <typename>
static void* AllocateObject(size_t size) { static void* AllocateObject(size_t size) {
return ThreadHeap::Allocate< return ThreadHeap::Allocate<
HeapLinkedHashSet<ValueArg, HashArg, TraitsArg>>(size); HeapLegacyLinkedHashSet<ValueArg, HashArg, TraitsArg>>(size);
} }
HeapLinkedHashSet() { CheckType(); } HeapLegacyLinkedHashSet() { CheckType(); }
}; };
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
template <typename T, typename U, typename V> template <typename T, typename U, typename V>
struct GCInfoTrait<HeapLinkedHashSet<T, U, V>> struct GCInfoTrait<HeapLegacyLinkedHashSet<T, U, V>>
: public GCInfoTrait<LinkedHashSet<T, U, V, HeapAllocator>> {}; : public GCInfoTrait<LegacyLinkedHashSet<T, U, V, HeapAllocator>> {};
// This class is still experimental. Do not use this class.
template <typename ValueArg, typename TraitsArg = HashTraits<ValueArg>> template <typename ValueArg, typename TraitsArg = HashTraits<ValueArg>>
class HeapNewLinkedHashSet class HeapLinkedHashSet
: public NewLinkedHashSet<ValueArg, TraitsArg, HeapAllocator> { : public LinkedHashSet<ValueArg, TraitsArg, HeapAllocator> {
IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); IS_GARBAGE_COLLECTED_CONTAINER_TYPE();
DISALLOW_NEW(); DISALLOW_NEW();
static void CheckType() { static void CheckType() {
static_assert(internal::IsMemberOrWeakMemberType<ValueArg>, static_assert(internal::IsMemberOrWeakMemberType<ValueArg>,
"HeapNewLinkedHashSet supports only Member and WeakMember."); "HeapLinkedHashSet supports only Member and WeakMember.");
// If not trivially destructible, we have to add a destructor which will // If not trivially destructible, we have to add a destructor which will
// hinder performance. // hinder performance.
static_assert(std::is_trivially_destructible<HeapNewLinkedHashSet>::value, static_assert(std::is_trivially_destructible<HeapLinkedHashSet>::value,
"HeapNewLinkedHashSet must be trivially destructible."); "HeapLinkedHashSet must be trivially destructible.");
static_assert( static_assert(
IsAllowedInContainer<ValueArg>::value, IsAllowedInContainer<ValueArg>::value,
"Not allowed to directly nest type. Use Member<> indirection instead."); "Not allowed to directly nest type. Use Member<> indirection instead.");
static_assert(WTF::IsTraceable<ValueArg>::value, static_assert(WTF::IsTraceable<ValueArg>::value,
"For sets without traceable elements, use NewLinkedHashSet<> " "For sets without traceable elements, use LinkedHashSet<> "
"instead of HeapNewLinkedHashSet<>."); "instead of HeapLinkedHashSet<>.");
} }
public: public:
template <typename> template <typename>
static void* AllocateObject(size_t size) { static void* AllocateObject(size_t size) {
return ThreadHeap::Allocate<HeapNewLinkedHashSet<ValueArg, TraitsArg>>( return ThreadHeap::Allocate<HeapLinkedHashSet<ValueArg, TraitsArg>>(size);
size);
} }
HeapNewLinkedHashSet() { HeapLinkedHashSet() { CheckType(); }
CheckType();
}
}; };
template <typename T, typename U> template <typename T, typename U>
struct GCInfoTrait<HeapNewLinkedHashSet<T, U>> struct GCInfoTrait<HeapLinkedHashSet<T, U>>
: public GCInfoTrait<NewLinkedHashSet<T, U, HeapAllocator>> {}; : public GCInfoTrait<LinkedHashSet<T, U, HeapAllocator>> {};
template <typename ValueArg, template <typename ValueArg,
wtf_size_t inlineCapacity = wtf_size_t inlineCapacity =
...@@ -751,7 +753,7 @@ struct VectorTraits<blink::Member<T>> : VectorTraitsBase<blink::Member<T>> { ...@@ -751,7 +753,7 @@ struct VectorTraits<blink::Member<T>> : VectorTraitsBase<blink::Member<T>> {
}; };
// These traits are used in VectorBackedLinkedList to support WeakMember in // These traits are used in VectorBackedLinkedList to support WeakMember in
// HeapNewLinkedHashSet though HeapVector<WeakMember> usage is still banned. // HeapLinkedHashSet though HeapVector<WeakMember> usage is still banned.
// (See the discussion in https://crrev.com/c/2246014) // (See the discussion in https://crrev.com/c/2246014)
template <typename T> template <typename T>
struct VectorTraits<blink::WeakMember<T>> struct VectorTraits<blink::WeakMember<T>>
......
...@@ -53,8 +53,9 @@ class PLATFORM_EXPORT MarkingVisitorBase : public Visitor { ...@@ -53,8 +53,9 @@ class PLATFORM_EXPORT MarkingVisitorBase : public Visitor {
// containing intra-object pointers, all of which must be relocated/rebased // containing intra-object pointers, all of which must be relocated/rebased
// with respect to the moved-to location. // with respect to the moved-to location.
// //
// For Blink, |HeapLinkedHashSet<>| is currently the only abstraction which // |HeapLegacyLinkedHashSet<>| is currently the only abstraction which
// relies on this feature. // relies on this feature.
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
void RegisterBackingStoreCallback(const void*, MovingObjectCallback) final; void RegisterBackingStoreCallback(const void*, MovingObjectCallback) final;
void RegisterMovableSlot(const void* const*) final; void RegisterMovableSlot(const void* const*) final;
......
...@@ -192,6 +192,37 @@ TEST_F(ConcurrentMarkingTest, SwapHashSet) { ...@@ -192,6 +192,37 @@ TEST_F(ConcurrentMarkingTest, SwapHashSet) {
SwapCollections<HeapHashSet<Member<IntegerObject>>>(); SwapCollections<HeapHashSet<Member<IntegerObject>>>();
} }
// HeapLegacyLinkedHashSet
template <typename T>
class HeapLegacyLinkedHashSetAdapter : public HeapLegacyLinkedHashSet<T> {
public:
ALWAYS_INLINE void swap(HeapLegacyLinkedHashSetAdapter<T>& other) {
HeapLegacyLinkedHashSet<T>::Swap(other);
}
};
TEST_F(ConcurrentMarkingTest, AddToLegacyLinkedHashSet) {
AddToCollection<HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromBeginningOfLegacyLinkedHashSet) {
RemoveFromBeginningOfCollection<
HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromMiddleOfLegacyLinkedHashSet) {
RemoveFromMiddleOfCollection<
HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromEndOfLegacyLinkedHashSet) {
RemoveFromEndOfCollection<
HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, ClearLegacyLinkedHashSet) {
ClearCollection<HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, SwapLegacyLinkedHashSet) {
SwapCollections<HeapLegacyLinkedHashSetAdapter<Member<IntegerObject>>>();
}
// HeapLinkedHashSet // HeapLinkedHashSet
template <typename T> template <typename T>
class HeapLinkedHashSetAdapter : public HeapLinkedHashSet<T> { class HeapLinkedHashSetAdapter : public HeapLinkedHashSet<T> {
...@@ -222,37 +253,6 @@ TEST_F(ConcurrentMarkingTest, SwapLinkedHashSet) { ...@@ -222,37 +253,6 @@ TEST_F(ConcurrentMarkingTest, SwapLinkedHashSet) {
SwapCollections<HeapLinkedHashSetAdapter<Member<IntegerObject>>>(); SwapCollections<HeapLinkedHashSetAdapter<Member<IntegerObject>>>();
} }
// HeapNewLinkedHashSet
template <typename T>
class HeapNewLinkedHashSetAdapter : public HeapNewLinkedHashSet<T> {
public:
ALWAYS_INLINE void swap(HeapNewLinkedHashSetAdapter<T>& other) {
HeapNewLinkedHashSet<T>::Swap(other);
}
};
TEST_F(ConcurrentMarkingTest, AddToNewLinkedHashSet) {
AddToCollection<HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromBeginningOfNewLinkedHashSet) {
RemoveFromBeginningOfCollection<
HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromMiddleOfNewLinkedHashSet) {
RemoveFromMiddleOfCollection<
HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, RemoveFromEndOfNewLinkedHashSet) {
RemoveFromEndOfCollection<
HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, ClearNewLinkedHashSet) {
ClearCollection<HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
TEST_F(ConcurrentMarkingTest, SwapNewLinkedHashSet) {
SwapCollections<HeapNewLinkedHashSetAdapter<Member<IntegerObject>>>();
}
// HeapListHashSet // HeapListHashSet
template <typename T> template <typename T>
......
...@@ -224,8 +224,8 @@ TEST_F(HeapCompactTest, CompactDeques) { ...@@ -224,8 +224,8 @@ TEST_F(HeapCompactTest, CompactDeques) {
EXPECT_EQ(static_cast<int>(7 - i), deque->at(i)->Value()); EXPECT_EQ(static_cast<int>(7 - i), deque->at(i)->Value());
} }
TEST_F(HeapCompactTest, CompactLinkedHashSet) { TEST_F(HeapCompactTest, CompactLegacyLinkedHashSet) {
using OrderedHashSet = HeapLinkedHashSet<Member<IntWrapper>>; using OrderedHashSet = HeapLegacyLinkedHashSet<Member<IntWrapper>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
IntWrapper* value = IntWrapper::Create(i, HashTablesAreCompacted); IntWrapper* value = IntWrapper::Create(i, HashTablesAreCompacted);
...@@ -249,8 +249,8 @@ TEST_F(HeapCompactTest, CompactLinkedHashSet) { ...@@ -249,8 +249,8 @@ TEST_F(HeapCompactTest, CompactLinkedHashSet) {
} }
} }
TEST_F(HeapCompactTest, CompactLinkedHashSetVector) { TEST_F(HeapCompactTest, CompactLegacyLinkedHashSetVector) {
using OrderedHashSet = HeapLinkedHashSet<Member<IntVector>>; using OrderedHashSet = HeapLegacyLinkedHashSet<Member<IntVector>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
IntWrapper* value = IntWrapper::Create(i); IntWrapper* value = IntWrapper::Create(i);
...@@ -275,9 +275,9 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetVector) { ...@@ -275,9 +275,9 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetVector) {
} }
} }
TEST_F(HeapCompactTest, CompactLinkedHashSetMap) { TEST_F(HeapCompactTest, CompactLegacyLinkedHashSetMap) {
using Inner = HeapHashSet<Member<IntWrapper>>; using Inner = HeapHashSet<Member<IntWrapper>>;
using OrderedHashSet = HeapLinkedHashSet<Member<Inner>>; using OrderedHashSet = HeapLegacyLinkedHashSet<Member<Inner>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
...@@ -306,9 +306,9 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetMap) { ...@@ -306,9 +306,9 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetMap) {
} }
} }
TEST_F(HeapCompactTest, CompactLinkedHashSetNested) { TEST_F(HeapCompactTest, CompactLegacyLinkedHashSetNested) {
using Inner = HeapLinkedHashSet<Member<IntWrapper>>; using Inner = HeapLegacyLinkedHashSet<Member<IntWrapper>>;
using OrderedHashSet = HeapLinkedHashSet<Member<Inner>>; using OrderedHashSet = HeapLegacyLinkedHashSet<Member<Inner>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
...@@ -337,8 +337,8 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetNested) { ...@@ -337,8 +337,8 @@ TEST_F(HeapCompactTest, CompactLinkedHashSetNested) {
} }
} }
TEST_F(HeapCompactTest, CompactNewLinkedHashSet) { TEST_F(HeapCompactTest, CompactLinkedHashSet) {
using OrderedHashSet = HeapNewLinkedHashSet<Member<IntWrapper>>; using OrderedHashSet = HeapLinkedHashSet<Member<IntWrapper>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
IntWrapper* value = IntWrapper::Create(i, HashTablesAreCompacted); IntWrapper* value = IntWrapper::Create(i, HashTablesAreCompacted);
...@@ -378,8 +378,8 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSet) { ...@@ -378,8 +378,8 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSet) {
EXPECT_EQ(7u, set->size()); EXPECT_EQ(7u, set->size());
} }
TEST_F(HeapCompactTest, CompactNewLinkedHashSetVector) { TEST_F(HeapCompactTest, CompactLinkedHashSetVector) {
using OrderedHashSet = HeapNewLinkedHashSet<Member<IntVector>>; using OrderedHashSet = HeapLinkedHashSet<Member<IntVector>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
IntWrapper* value = IntWrapper::Create(i); IntWrapper* value = IntWrapper::Create(i);
...@@ -404,9 +404,9 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSetVector) { ...@@ -404,9 +404,9 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSetVector) {
} }
} }
TEST_F(HeapCompactTest, CompactNewLinkedHashSetMap) { TEST_F(HeapCompactTest, CompactLinkedHashSetMap) {
using Inner = HeapHashSet<Member<IntWrapper>>; using Inner = HeapHashSet<Member<IntWrapper>>;
using OrderedHashSet = HeapNewLinkedHashSet<Member<Inner>>; using OrderedHashSet = HeapLinkedHashSet<Member<Inner>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
...@@ -435,9 +435,9 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSetMap) { ...@@ -435,9 +435,9 @@ TEST_F(HeapCompactTest, CompactNewLinkedHashSetMap) {
} }
} }
TEST_F(HeapCompactTest, CompactNewLinkedHashSetNested) { TEST_F(HeapCompactTest, CompactLinkedHashSetNested) {
using Inner = HeapNewLinkedHashSet<Member<IntWrapper>>; using Inner = HeapLinkedHashSet<Member<IntWrapper>>;
using OrderedHashSet = HeapNewLinkedHashSet<Member<Inner>>; using OrderedHashSet = HeapLinkedHashSet<Member<Inner>>;
Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>(); Persistent<OrderedHashSet> set = MakeGarbageCollected<OrderedHashSet>();
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
......
...@@ -904,59 +904,59 @@ TEST_F(IncrementalMarkingTest, HeapHashSetSwap) { ...@@ -904,59 +904,59 @@ TEST_F(IncrementalMarkingTest, HeapHashSetSwap) {
} }
// ============================================================================= // =============================================================================
// HeapLinkedHashSet support. ================================================== // HeapLegacyLinkedHashSet support. ============================================
// ============================================================================= // =============================================================================
TEST_F(IncrementalMarkingTest, HeapLinkedHashSetInsert) { TEST_F(IncrementalMarkingTest, HeapLegacyLinkedHashSetInsert) {
Insert<HeapLinkedHashSet<Member<Object>>>(); Insert<HeapLegacyLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Insert<HeapLinkedHashSet<WeakMember<Object>>>(); Insert<HeapLegacyLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapLinkedHashSetCopy) { TEST_F(IncrementalMarkingTest, HeapLegacyLinkedHashSetCopy) {
Copy<HeapLinkedHashSet<Member<Object>>>(); Copy<HeapLegacyLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Copy<HeapLinkedHashSet<WeakMember<Object>>>(); Copy<HeapLegacyLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapLinkedHashSetMove) { TEST_F(IncrementalMarkingTest, HeapLegacyLinkedHashSetMove) {
Move<HeapLinkedHashSet<Member<Object>>>(); Move<HeapLegacyLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Move<HeapLinkedHashSet<WeakMember<Object>>>(); Move<HeapLegacyLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapLinkedHashSetSwap) { TEST_F(IncrementalMarkingTest, HeapLegacyLinkedHashSetSwap) {
Swap<HeapLinkedHashSet<Member<Object>>>(); Swap<HeapLegacyLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Swap<HeapLinkedHashSet<WeakMember<Object>>>(); Swap<HeapLegacyLinkedHashSet<WeakMember<Object>>>();
} }
// ============================================================================= // =============================================================================
// HeapNewLinkedHashSet support. =============================================== // HeapLinkedHashSet support. ==================================================
// ============================================================================= // =============================================================================
TEST_F(IncrementalMarkingTest, HeapNewLinkedHashSetInsert) { TEST_F(IncrementalMarkingTest, HeapLinkedHashSetInsert) {
Insert<HeapNewLinkedHashSet<Member<Object>>>(); Insert<HeapLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Insert<HeapNewLinkedHashSet<WeakMember<Object>>>(); Insert<HeapLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapNewLinkedHashSetCopy) { TEST_F(IncrementalMarkingTest, HeapLinkedHashSetCopy) {
Copy<HeapNewLinkedHashSet<Member<Object>>>(); Copy<HeapLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Copy<HeapNewLinkedHashSet<WeakMember<Object>>>(); Copy<HeapLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapNewLinkedHashSetMove) { TEST_F(IncrementalMarkingTest, HeapLinkedHashSetMove) {
Move<HeapNewLinkedHashSet<Member<Object>>>(); Move<HeapLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Move<HeapNewLinkedHashSet<WeakMember<Object>>>(); Move<HeapLinkedHashSet<WeakMember<Object>>>();
} }
TEST_F(IncrementalMarkingTest, HeapNewLinkedHashSetSwap) { TEST_F(IncrementalMarkingTest, HeapLinkedHashSetSwap) {
Swap<HeapNewLinkedHashSet<Member<Object>>>(); Swap<HeapLinkedHashSet<Member<Object>>>();
// Weak references are strongified for the current cycle. // Weak references are strongified for the current cycle.
Swap<HeapNewLinkedHashSet<WeakMember<Object>>>(); Swap<HeapLinkedHashSet<WeakMember<Object>>>();
} }
// ============================================================================= // =============================================================================
...@@ -1809,12 +1809,12 @@ class Destructed final : public GarbageCollected<Destructed> { ...@@ -1809,12 +1809,12 @@ class Destructed final : public GarbageCollected<Destructed> {
size_t Destructed::n_destructed = 0; size_t Destructed::n_destructed = 0;
class LinkedHashSetWrapper final class LegacyLinkedHashSetWrapper final
: public GarbageCollected<LinkedHashSetWrapper> { : public GarbageCollected<LegacyLinkedHashSetWrapper> {
public: public:
using HashType = HeapLinkedHashSet<Member<Destructed>>; using HashType = HeapLegacyLinkedHashSet<Member<Destructed>>;
LinkedHashSetWrapper() { LegacyLinkedHashSetWrapper() {
for (size_t i = 0; i < 10; ++i) { for (size_t i = 0; i < 10; ++i) {
hash_set_.insert(MakeGarbageCollected<Destructed>()); hash_set_.insert(MakeGarbageCollected<Destructed>());
} }
...@@ -1830,7 +1830,7 @@ class LinkedHashSetWrapper final ...@@ -1830,7 +1830,7 @@ class LinkedHashSetWrapper final
HashType hash_set_; HashType hash_set_;
}; };
TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) { TEST_F(IncrementalMarkingTest, LegacyLinkedHashSetMovingCallback) {
ClearOutOldGarbage(); ClearOutOldGarbage();
Destructed::n_destructed = 0; Destructed::n_destructed = 0;
...@@ -1838,16 +1838,16 @@ TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) { ...@@ -1838,16 +1838,16 @@ TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) {
HeapHashSet<Member<Destructed>> to_be_destroyed; HeapHashSet<Member<Destructed>> to_be_destroyed;
to_be_destroyed.ReserveCapacityForSize(100); to_be_destroyed.ReserveCapacityForSize(100);
} }
Persistent<LinkedHashSetWrapper> wrapper = Persistent<LegacyLinkedHashSetWrapper> wrapper =
MakeGarbageCollected<LinkedHashSetWrapper>(); MakeGarbageCollected<LegacyLinkedHashSetWrapper>();
IncrementalMarkingTestDriver driver(ThreadState::Current()); IncrementalMarkingTestDriver driver(ThreadState::Current());
ThreadState::Current()->EnableCompactionForNextGCForTesting(); ThreadState::Current()->EnableCompactionForNextGCForTesting();
driver.Start(); driver.Start();
driver.FinishSteps(); driver.FinishSteps();
// Destroy the link between original HeapLinkedHashSet object and its backing // Destroy the link between original HeapLegacyLinkedHashSet object and its
// store. // backing store.
wrapper->Swap(); wrapper->Swap();
DCHECK(wrapper->hash_set_.IsEmpty()); DCHECK(wrapper->hash_set_.IsEmpty());
...@@ -1856,12 +1856,12 @@ TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) { ...@@ -1856,12 +1856,12 @@ TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) {
EXPECT_EQ(10u, Destructed::n_destructed); EXPECT_EQ(10u, Destructed::n_destructed);
} }
class NewLinkedHashSetWrapper final class LinkedHashSetWrapper final
: public GarbageCollected<NewLinkedHashSetWrapper> { : public GarbageCollected<LinkedHashSetWrapper> {
public: public:
using HashType = HeapNewLinkedHashSet<Member<Destructed>>; using HashType = HeapLinkedHashSet<Member<Destructed>>;
NewLinkedHashSetWrapper() { LinkedHashSetWrapper() {
for (size_t i = 0; i < 10; ++i) { for (size_t i = 0; i < 10; ++i) {
hash_set_.insert(MakeGarbageCollected<Destructed>()); hash_set_.insert(MakeGarbageCollected<Destructed>());
} }
...@@ -1877,7 +1877,7 @@ class NewLinkedHashSetWrapper final ...@@ -1877,7 +1877,7 @@ class NewLinkedHashSetWrapper final
HashType hash_set_; HashType hash_set_;
}; };
TEST_F(IncrementalMarkingTest, NewLinkedHashSetMovingCallback) { TEST_F(IncrementalMarkingTest, LinkedHashSetMovingCallback) {
ClearOutOldGarbage(); ClearOutOldGarbage();
Destructed::n_destructed = 0; Destructed::n_destructed = 0;
...@@ -1885,16 +1885,16 @@ TEST_F(IncrementalMarkingTest, NewLinkedHashSetMovingCallback) { ...@@ -1885,16 +1885,16 @@ TEST_F(IncrementalMarkingTest, NewLinkedHashSetMovingCallback) {
HeapHashSet<Member<Destructed>> to_be_destroyed; HeapHashSet<Member<Destructed>> to_be_destroyed;
to_be_destroyed.ReserveCapacityForSize(100); to_be_destroyed.ReserveCapacityForSize(100);
} }
Persistent<NewLinkedHashSetWrapper> wrapper = Persistent<LinkedHashSetWrapper> wrapper =
MakeGarbageCollected<NewLinkedHashSetWrapper>(); MakeGarbageCollected<LinkedHashSetWrapper>();
IncrementalMarkingTestDriver driver(ThreadState::Current()); IncrementalMarkingTestDriver driver(ThreadState::Current());
ThreadState::Current()->EnableCompactionForNextGCForTesting(); ThreadState::Current()->EnableCompactionForNextGCForTesting();
driver.Start(); driver.Start();
driver.FinishSteps(); driver.FinishSteps();
// Destroy the link between original NewHeapLinkedHashSet object and its // Destroy the link between original HeapLinkedHashSet object and its backing
// backing store. // store.
wrapper->Swap(); wrapper->Swap();
DCHECK(wrapper->hash_set_.IsEmpty()); DCHECK(wrapper->hash_set_.IsEmpty());
......
...@@ -207,9 +207,12 @@ TEST_F(WeaknessMarkingTest, SwapIntoAlreadyProcessedWeakSet) { ...@@ -207,9 +207,12 @@ TEST_F(WeaknessMarkingTest, SwapIntoAlreadyProcessedWeakSet) {
// Test ensures that an empty weak set that has already been marked sets up // Test ensures that an empty weak set that has already been marked sets up
// weakness callbacks. This is important as another backing may be swapped in // weakness callbacks. This is important as another backing may be swapped in
// at some point after marking it initially. // at some point after marking it initially.
using WeakLinkedSet = HeapLinkedHashSet<WeakMember<IntegerObject>>; using WeakLegacyLinkedSet =
Persistent<WeakLinkedSet> holder1(MakeGarbageCollected<WeakLinkedSet>()); HeapLegacyLinkedHashSet<WeakMember<IntegerObject>>;
Persistent<WeakLinkedSet> holder2(MakeGarbageCollected<WeakLinkedSet>()); Persistent<WeakLegacyLinkedSet> holder1(
MakeGarbageCollected<WeakLegacyLinkedSet>());
Persistent<WeakLegacyLinkedSet> holder2(
MakeGarbageCollected<WeakLegacyLinkedSet>());
holder1->insert(MakeGarbageCollected<IntegerObject>(1)); holder1->insert(MakeGarbageCollected<IntegerObject>(1));
IncrementalMarkingTestDriver driver(ThreadState::Current()); IncrementalMarkingTestDriver driver(ThreadState::Current());
driver.Start(); driver.Start();
...@@ -217,11 +220,9 @@ TEST_F(WeaknessMarkingTest, SwapIntoAlreadyProcessedWeakSet) { ...@@ -217,11 +220,9 @@ TEST_F(WeaknessMarkingTest, SwapIntoAlreadyProcessedWeakSet) {
holder1->Swap(*holder2.Get()); holder1->Swap(*holder2.Get());
driver.FinishGC(); driver.FinishGC();
using NewWeakLinkedSet = HeapNewLinkedHashSet<WeakMember<IntegerObject>>; using WeakLinkedSet = HeapLinkedHashSet<WeakMember<IntegerObject>>;
Persistent<NewWeakLinkedSet> holder3( Persistent<WeakLinkedSet> holder3(MakeGarbageCollected<WeakLinkedSet>());
MakeGarbageCollected<NewWeakLinkedSet>()); Persistent<WeakLinkedSet> holder4(MakeGarbageCollected<WeakLinkedSet>());
Persistent<NewWeakLinkedSet> holder4(
MakeGarbageCollected<NewWeakLinkedSet>());
holder3->insert(MakeGarbageCollected<IntegerObject>(1)); holder3->insert(MakeGarbageCollected<IntegerObject>(1));
IncrementalMarkingTestDriver driver2(ThreadState::Current()); IncrementalMarkingTestDriver driver2(ThreadState::Current());
driver2.Start(); driver2.Start();
...@@ -257,9 +258,9 @@ TEST_F(WeaknessMarkingTest, ClearWeakHashTableAfterMarking) { ...@@ -257,9 +258,9 @@ TEST_F(WeaknessMarkingTest, ClearWeakHashTableAfterMarking) {
TEST_F(WeaknessMarkingTest, StrongifyBackingOnStack) { TEST_F(WeaknessMarkingTest, StrongifyBackingOnStack) {
// Test eunsures that conservative GC strongifies the backing store of // Test eunsures that conservative GC strongifies the backing store of
// on-stack NewLinkedHashSet. // on-stack HeapLinkedHashSet.
using WeakSet = HeapNewLinkedHashSet<WeakMember<IntegerObject>>; using WeakSet = HeapLinkedHashSet<WeakMember<IntegerObject>>;
using StrongSet = HeapNewLinkedHashSet<Member<IntegerObject>>; using StrongSet = HeapLinkedHashSet<Member<IntegerObject>>;
WeakSet weak_set_on_stack; WeakSet weak_set_on_stack;
weak_set_on_stack.insert(MakeGarbageCollected<IntegerObject>(1)); weak_set_on_stack.insert(MakeGarbageCollected<IntegerObject>(1));
StrongSet strong_set_on_stack; StrongSet strong_set_on_stack;
......
...@@ -376,21 +376,22 @@ struct TraceInCollectionTrait< ...@@ -376,21 +376,22 @@ struct TraceInCollectionTrait<
} }
}; };
// Nodes used by LinkedHashSet. Again we need two versions to disambiguate the // Nodes used by LegacyLinkedHashSet. Again we need two versions to
// template. // disambiguate the template.
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
template <typename Value, typename Traits> template <typename Value, typename Traits>
struct TraceInCollectionTrait<kNoWeakHandling, struct TraceInCollectionTrait<kNoWeakHandling,
LinkedHashSetNode<Value>, LegacyLinkedHashSetNode<Value>,
Traits> { Traits> {
static bool IsAlive(const blink::LivenessBroker& info, static bool IsAlive(const blink::LivenessBroker& info,
const LinkedHashSetNode<Value>& self) { const LegacyLinkedHashSetNode<Value>& self) {
return TraceInCollectionTrait< return TraceInCollectionTrait<
kNoWeakHandling, Value, kNoWeakHandling, Value,
typename Traits::ValueTraits>::IsAlive(info, self.value_); typename Traits::ValueTraits>::IsAlive(info, self.value_);
} }
static void Trace(blink::Visitor* visitor, static void Trace(blink::Visitor* visitor,
const LinkedHashSetNode<Value>& self) { const LegacyLinkedHashSetNode<Value>& self) {
static_assert( static_assert(
IsTraceableInCollectionTrait<Traits>::value || IsWeak<Value>::value, IsTraceableInCollectionTrait<Traits>::value || IsWeak<Value>::value,
"T should be traceable (or weak)"); "T should be traceable (or weak)");
...@@ -401,16 +402,18 @@ struct TraceInCollectionTrait<kNoWeakHandling, ...@@ -401,16 +402,18 @@ struct TraceInCollectionTrait<kNoWeakHandling,
}; };
template <typename Value, typename Traits> template <typename Value, typename Traits>
struct TraceInCollectionTrait<kWeakHandling, LinkedHashSetNode<Value>, Traits> { struct TraceInCollectionTrait<kWeakHandling,
LegacyLinkedHashSetNode<Value>,
Traits> {
static bool IsAlive(const blink::LivenessBroker& info, static bool IsAlive(const blink::LivenessBroker& info,
const LinkedHashSetNode<Value>& self) { const LegacyLinkedHashSetNode<Value>& self) {
return TraceInCollectionTrait< return TraceInCollectionTrait<
kWeakHandling, Value, kWeakHandling, Value,
typename Traits::ValueTraits>::IsAlive(info, self.value_); typename Traits::ValueTraits>::IsAlive(info, self.value_);
} }
static void Trace(blink::Visitor* visitor, static void Trace(blink::Visitor* visitor,
const LinkedHashSetNode<Value>& self) { const LegacyLinkedHashSetNode<Value>& self) {
TraceInCollectionTrait<kWeakHandling, Value, TraceInCollectionTrait<kWeakHandling, Value,
typename Traits::ValueTraits>::Trace(visitor, typename Traits::ValueTraits>::Trace(visitor,
self.value_); self.value_);
......
...@@ -219,11 +219,12 @@ template <typename Key, ...@@ -219,11 +219,12 @@ template <typename Key,
typename KeyTraits, typename KeyTraits,
typename Allocator> typename Allocator>
class HashTableConstIterator; class HashTableConstIterator;
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
template <typename Value, template <typename Value,
typename HashFunctions, typename HashFunctions,
typename HashTraits, typename HashTraits,
typename Allocator> typename Allocator>
class LinkedHashSet; class LegacyLinkedHashSet;
template <WeakHandlingFlag x, template <WeakHandlingFlag x,
typename T, typename T,
typename U, typename U,
...@@ -1018,8 +1019,9 @@ class HashTable final ...@@ -1018,8 +1019,9 @@ class HashTable final
typename Y, typename Y,
typename Z> typename Z>
friend struct WeakProcessingHashTableHelper; friend struct WeakProcessingHashTableHelper;
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
template <typename T, typename U, typename V, typename W> template <typename T, typename U, typename V, typename W>
friend class LinkedHashSet; friend class LegacyLinkedHashSet;
template <typename T, size_t, typename U, typename V> template <typename T, size_t, typename U, typename V>
friend class ListHashSet; friend class ListHashSet;
}; };
......
...@@ -99,9 +99,10 @@ struct GenericHashTraitsBase<false, T> { ...@@ -99,9 +99,10 @@ struct GenericHashTraitsBase<false, T> {
static constexpr bool kCanHaveDeletedValue = true; static constexpr bool kCanHaveDeletedValue = true;
// The kHasMovingCallback value is only used for HashTable backing stores. // The kHasMovingCallback value is only used for HashTable backing stores.
// Currently it is needed for LinkedHashSet to register moving callback on // Currently it is needed for LegacyLinkedHashSet to register moving callback
// write barrier. Users of this value have to provide RegisterMovingCallback // on write barrier. Users of this value have to provide
// function. // RegisterMovingCallback function.
// TODO(bartekn): Remove once fully transitioned to LinkedHashSet.
static constexpr bool kHasMovingCallback = false; static constexpr bool kHasMovingCallback = false;
// The kCanTraceConcurrently value is used by Oilpan concurrent marking. Only // The kCanTraceConcurrently value is used by Oilpan concurrent marking. Only
......
...@@ -11,12 +11,17 @@ ...@@ -11,12 +11,17 @@
namespace WTF { namespace WTF {
static_assert(!WTF::IsTraceable<LinkedHashSet<int>>::value,
"LinkedHashSet must not be traceable.");
static_assert(!WTF::IsTraceable<LinkedHashSet<String>>::value,
"LinkedHashSet must not be traceable.");
template <typename T> template <typename T>
int* const ValueInstanceCount<T>::kDeletedValue = int* const ValueInstanceCount<T>::kDeletedValue =
reinterpret_cast<int*>(static_cast<uintptr_t>(-1)); reinterpret_cast<int*>(static_cast<uintptr_t>(-1));
TEST(NewLinkedHashSetTest, CopyConstructAndAssignInt) { TEST(LinkedHashSetTest, CopyConstructAndAssignInt) {
using Set = NewLinkedHashSet<ValueInstanceCount<int>>; using Set = LinkedHashSet<ValueInstanceCount<int>>;
// Declare the counters before the set, because they have to outlive teh set. // Declare the counters before the set, because they have to outlive teh set.
int counter1 = 0; int counter1 = 0;
int counter2 = 0; int counter2 = 0;
...@@ -53,8 +58,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignInt) { ...@@ -53,8 +58,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignInt) {
EXPECT_EQ(counter3, 6); EXPECT_EQ(counter3, 6);
} }
TEST(NewLinkedHashSetTest, CopyConstructAndAssignIntPtr) { TEST(LinkedHashSetTest, CopyConstructAndAssignIntPtr) {
using Set = NewLinkedHashSet<int*>; using Set = LinkedHashSet<int*>;
Set set1; Set set1;
EXPECT_EQ(set1.size(), 0u); EXPECT_EQ(set1.size(), 0u);
EXPECT_TRUE(set1.IsEmpty()); EXPECT_TRUE(set1.IsEmpty());
...@@ -99,8 +104,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignIntPtr) { ...@@ -99,8 +104,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignIntPtr) {
} }
} }
TEST(NewLinkedHashSetTest, CopyConstructAndAssignString) { TEST(LinkedHashSetTest, CopyConstructAndAssignString) {
using Set = NewLinkedHashSet<String>; using Set = LinkedHashSet<String>;
Set set1; Set set1;
EXPECT_EQ(set1.size(), 0u); EXPECT_EQ(set1.size(), 0u);
EXPECT_TRUE(set1.IsEmpty()); EXPECT_TRUE(set1.IsEmpty());
...@@ -144,8 +149,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignString) { ...@@ -144,8 +149,8 @@ TEST(NewLinkedHashSetTest, CopyConstructAndAssignString) {
} }
} }
TEST(NewLinkedHashSetTest, MoveConstructAndAssignInt) { TEST(LinkedHashSetTest, MoveConstructAndAssignInt) {
using Set = NewLinkedHashSet<ValueInstanceCount<int>>; using Set = LinkedHashSet<ValueInstanceCount<int>>;
int counter1 = 0; int counter1 = 0;
int counter2 = 0; int counter2 = 0;
int counter3 = 0; int counter3 = 0;
...@@ -181,8 +186,8 @@ TEST(NewLinkedHashSetTest, MoveConstructAndAssignInt) { ...@@ -181,8 +186,8 @@ TEST(NewLinkedHashSetTest, MoveConstructAndAssignInt) {
EXPECT_EQ(counter3, 4); EXPECT_EQ(counter3, 4);
} }
TEST(NewLinkedHashSetTest, MoveConstructAndAssignString) { TEST(LinkedHashSetTest, MoveConstructAndAssignString) {
using Set = NewLinkedHashSet<ValueInstanceCount<String>>; using Set = LinkedHashSet<ValueInstanceCount<String>>;
int counter1 = 0; int counter1 = 0;
int counter2 = 0; int counter2 = 0;
int counter3 = 0; int counter3 = 0;
...@@ -218,15 +223,15 @@ TEST(NewLinkedHashSetTest, MoveConstructAndAssignString) { ...@@ -218,15 +223,15 @@ TEST(NewLinkedHashSetTest, MoveConstructAndAssignString) {
EXPECT_EQ(counter3, 4); EXPECT_EQ(counter3, 4);
} }
TEST(NewLinkedHashSetTest, Iterator) { TEST(LinkedHashSetTest, Iterator) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
EXPECT_TRUE(set.begin() == set.end()); EXPECT_TRUE(set.begin() == set.end());
EXPECT_TRUE(set.rbegin() == set.rend()); EXPECT_TRUE(set.rbegin() == set.rend());
} }
TEST(NewLinkedHashSetTest, FrontAndBack) { TEST(LinkedHashSetTest, FrontAndBack) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
EXPECT_EQ(set.size(), 0u); EXPECT_EQ(set.size(), 0u);
EXPECT_TRUE(set.IsEmpty()); EXPECT_TRUE(set.IsEmpty());
...@@ -252,8 +257,8 @@ TEST(NewLinkedHashSetTest, FrontAndBack) { ...@@ -252,8 +257,8 @@ TEST(NewLinkedHashSetTest, FrontAndBack) {
EXPECT_EQ(set.back(), 1); EXPECT_EQ(set.back(), 1);
} }
TEST(NewLinkedHashSetTest, FindAndContains) { TEST(LinkedHashSetTest, FindAndContains) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.insert(2); set.insert(2);
set.AppendOrMoveToLast(2); set.AppendOrMoveToLast(2);
...@@ -284,8 +289,8 @@ TEST(NewLinkedHashSetTest, FindAndContains) { ...@@ -284,8 +289,8 @@ TEST(NewLinkedHashSetTest, FindAndContains) {
EXPECT_FALSE(set.Contains(10)); EXPECT_FALSE(set.Contains(10));
} }
TEST(NewLinkedHashSetTest, Insert) { TEST(LinkedHashSetTest, Insert) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
Set::AddResult result = set.insert(1); Set::AddResult result = set.insert(1);
EXPECT_TRUE(result.is_new_entry); EXPECT_TRUE(result.is_new_entry);
...@@ -317,8 +322,8 @@ TEST(NewLinkedHashSetTest, Insert) { ...@@ -317,8 +322,8 @@ TEST(NewLinkedHashSetTest, Insert) {
EXPECT_TRUE(it == set.end()); EXPECT_TRUE(it == set.end());
} }
TEST(NewLinkedHashSetTest, InsertBefore) { TEST(LinkedHashSetTest, InsertBefore) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.InsertBefore(set.begin(), 1); set.InsertBefore(set.begin(), 1);
...@@ -344,8 +349,8 @@ TEST(NewLinkedHashSetTest, InsertBefore) { ...@@ -344,8 +349,8 @@ TEST(NewLinkedHashSetTest, InsertBefore) {
EXPECT_TRUE(it == set.end()); EXPECT_TRUE(it == set.end());
} }
TEST(NewLinkedHashSetTest, AppendOrMoveToLast) { TEST(LinkedHashSetTest, AppendOrMoveToLast) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
Set::AddResult result = set.AppendOrMoveToLast(1); Set::AddResult result = set.AppendOrMoveToLast(1);
EXPECT_TRUE(result.is_new_entry); EXPECT_TRUE(result.is_new_entry);
...@@ -371,8 +376,8 @@ TEST(NewLinkedHashSetTest, AppendOrMoveToLast) { ...@@ -371,8 +376,8 @@ TEST(NewLinkedHashSetTest, AppendOrMoveToLast) {
EXPECT_EQ(*it, 3); EXPECT_EQ(*it, 3);
} }
TEST(NewLinkedHashSetTest, PrependOrMoveToFirst) { TEST(LinkedHashSetTest, PrependOrMoveToFirst) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
Set::AddResult result = set.PrependOrMoveToFirst(1); Set::AddResult result = set.PrependOrMoveToFirst(1);
EXPECT_TRUE(result.is_new_entry); EXPECT_TRUE(result.is_new_entry);
...@@ -398,8 +403,8 @@ TEST(NewLinkedHashSetTest, PrependOrMoveToFirst) { ...@@ -398,8 +403,8 @@ TEST(NewLinkedHashSetTest, PrependOrMoveToFirst) {
EXPECT_EQ(*it, 2); EXPECT_EQ(*it, 2);
} }
TEST(NewLinkedHashSetTest, Erase) { TEST(LinkedHashSetTest, Erase) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.insert(1); set.insert(1);
set.insert(2); set.insert(2);
...@@ -442,8 +447,8 @@ TEST(NewLinkedHashSetTest, Erase) { ...@@ -442,8 +447,8 @@ TEST(NewLinkedHashSetTest, Erase) {
EXPECT_EQ(*it, 6); EXPECT_EQ(*it, 6);
} }
TEST(NewLinkedHashSetTest, RemoveFirst) { TEST(LinkedHashSetTest, RemoveFirst) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.insert(1); set.insert(1);
set.insert(2); set.insert(2);
...@@ -463,8 +468,8 @@ TEST(NewLinkedHashSetTest, RemoveFirst) { ...@@ -463,8 +468,8 @@ TEST(NewLinkedHashSetTest, RemoveFirst) {
EXPECT_TRUE(set.begin() == set.end()); EXPECT_TRUE(set.begin() == set.end());
} }
TEST(NewLinkedHashSetTest, pop_back) { TEST(LinkedHashSetTest, pop_back) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.insert(1); set.insert(1);
set.insert(2); set.insert(2);
...@@ -484,8 +489,8 @@ TEST(NewLinkedHashSetTest, pop_back) { ...@@ -484,8 +489,8 @@ TEST(NewLinkedHashSetTest, pop_back) {
EXPECT_TRUE(set.begin() == set.end()); EXPECT_TRUE(set.begin() == set.end());
} }
TEST(NewLinkedHashSetTest, Clear) { TEST(LinkedHashSetTest, Clear) {
using Set = NewLinkedHashSet<int>; using Set = LinkedHashSet<int>;
Set set; Set set;
set.insert(1); set.insert(1);
set.insert(2); set.insert(2);
...@@ -544,13 +549,13 @@ struct DefaultHash<EmptyString> { ...@@ -544,13 +549,13 @@ struct DefaultHash<EmptyString> {
}; };
}; };
// This ensures that NewLinkedHashSet can store a struct that needs // This ensures that LinkedHashSet can store a struct that needs
// HashTraits<>::kEmptyValueIsZero set to false. The default EmptyValue() of // HashTraits<>::kEmptyValueIsZero set to false. The default EmptyValue() of
// SimpleClassHashTraits<> returns a value created with the default constructor, // SimpleClassHashTraits<> returns a value created with the default constructor,
// so a custom HashTraits that sets kEmptyValueIsZero to false and also // so a custom HashTraits that sets kEmptyValueIsZero to false and also
// overrides EmptyValue() to provide another empty value is needed. // overrides EmptyValue() to provide another empty value is needed.
TEST(NewLinkedHashSetEmptyTest, EmptyString) { TEST(LinkedHashSetEmptyTest, EmptyString) {
using Set = NewLinkedHashSet<EmptyString>; using Set = LinkedHashSet<EmptyString>;
Set set; Set set;
set.insert(EmptyString()); set.insert(EmptyString());
} }
......
...@@ -41,7 +41,7 @@ namespace { ...@@ -41,7 +41,7 @@ namespace {
template <typename Set> template <typename Set>
class ListOrLinkedHashSetTest : public testing::Test {}; class ListOrLinkedHashSetTest : public testing::Test {};
// These custom traits affect only NewLinkedHashSet tests. // These custom traits affect only LinkedHashSet tests.
struct CustomHashTraitsForInt : public HashTraits<int> { struct CustomHashTraitsForInt : public HashTraits<int> {
static const bool kEmptyValueIsZero = false; static const bool kEmptyValueIsZero = false;
static int EmptyValue() { return INT_MAX; } static int EmptyValue() { return INT_MAX; }
...@@ -52,8 +52,8 @@ struct CustomHashTraitsForInt : public HashTraits<int> { ...@@ -52,8 +52,8 @@ struct CustomHashTraitsForInt : public HashTraits<int> {
using SetTypes = testing::Types<ListHashSet<int>, using SetTypes = testing::Types<ListHashSet<int>,
ListHashSet<int, 1>, ListHashSet<int, 1>,
LinkedHashSet<int>, LegacyLinkedHashSet<int>,
NewLinkedHashSet<int, CustomHashTraitsForInt>>; LinkedHashSet<int, CustomHashTraitsForInt>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetTest, SetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetTest, SetTypes);
TYPED_TEST(ListOrLinkedHashSetTest, RemoveFirst) { TYPED_TEST(ListOrLinkedHashSetTest, RemoveFirst) {
...@@ -240,8 +240,8 @@ TYPED_TEST(ListOrLinkedHashSetTest, Find) { ...@@ -240,8 +240,8 @@ TYPED_TEST(ListOrLinkedHashSetTest, Find) {
TYPED_TEST(ListOrLinkedHashSetTest, InsertBefore) { TYPED_TEST(ListOrLinkedHashSetTest, InsertBefore) {
using Set = TypeParam; using Set = TypeParam;
bool can_modify_while_iterating = bool can_modify_while_iterating =
!std::is_same<Set, LinkedHashSet<int>>::value && !std::is_same<Set, LegacyLinkedHashSet<int>>::value &&
!std::is_same<Set, NewLinkedHashSet<int, CustomHashTraitsForInt>>::value; !std::is_same<Set, LinkedHashSet<int, CustomHashTraitsForInt>>::value;
Set set; Set set;
set.insert(-1); set.insert(-1);
set.insert(0); set.insert(0);
...@@ -373,16 +373,15 @@ class ListOrLinkedHashSetRefPtrTest : public testing::Test {}; ...@@ -373,16 +373,15 @@ class ListOrLinkedHashSetRefPtrTest : public testing::Test {};
using RefPtrSetTypes = using RefPtrSetTypes =
testing::Types<ListHashSet<scoped_refptr<DummyRefCounted>>, testing::Types<ListHashSet<scoped_refptr<DummyRefCounted>>,
ListHashSet<scoped_refptr<DummyRefCounted>, 1>, ListHashSet<scoped_refptr<DummyRefCounted>, 1>,
LinkedHashSet<scoped_refptr<DummyRefCounted>>, LegacyLinkedHashSet<scoped_refptr<DummyRefCounted>>,
NewLinkedHashSet<scoped_refptr<DummyRefCounted>>>; LinkedHashSet<scoped_refptr<DummyRefCounted>>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetRefPtrTest, RefPtrSetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetRefPtrTest, RefPtrSetTypes);
TYPED_TEST(ListOrLinkedHashSetRefPtrTest, WithRefPtr) { TYPED_TEST(ListOrLinkedHashSetRefPtrTest, WithRefPtr) {
using Set = TypeParam; using Set = TypeParam;
int expected = 1; int expected = 1;
// NewLinkedHashSet stores each object twice. // LinkedHashSet stores each object twice.
if (std::is_same<Set, if (std::is_same<Set, LinkedHashSet<scoped_refptr<DummyRefCounted>>>::value)
NewLinkedHashSet<scoped_refptr<DummyRefCounted>>>::value)
expected = 2; expected = 2;
bool is_deleted = false; bool is_deleted = false;
DummyRefCounted::ref_invokes_count_ = 0; DummyRefCounted::ref_invokes_count_ = 0;
...@@ -485,11 +484,11 @@ struct ComplexityTranslator { ...@@ -485,11 +484,11 @@ struct ComplexityTranslator {
template <typename Set> template <typename Set>
class ListOrLinkedHashSetTranslatorTest : public testing::Test {}; class ListOrLinkedHashSetTranslatorTest : public testing::Test {};
// TODO(bartekn): Add NewLinkedHashSet once it supports custom hash function. // TODO(bartekn): Add LinkedHashSet once it supports custom hash function.
using TranslatorSetTypes = using TranslatorSetTypes =
testing::Types<ListHashSet<Complicated, 256, ComplicatedHashFunctions>, testing::Types<ListHashSet<Complicated, 256, ComplicatedHashFunctions>,
ListHashSet<Complicated, 1, ComplicatedHashFunctions>, ListHashSet<Complicated, 1, ComplicatedHashFunctions>,
LinkedHashSet<Complicated, ComplicatedHashFunctions>>; LegacyLinkedHashSet<Complicated, ComplicatedHashFunctions>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetTranslatorTest, TranslatorSetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetTranslatorTest, TranslatorSetTypes);
TYPED_TEST(ListOrLinkedHashSetTranslatorTest, ComplexityTranslator) { TYPED_TEST(ListOrLinkedHashSetTranslatorTest, ComplexityTranslator) {
...@@ -595,8 +594,8 @@ class ListOrLinkedHashSetCountCopyTest : public testing::Test {}; ...@@ -595,8 +594,8 @@ class ListOrLinkedHashSetCountCopyTest : public testing::Test {};
using CountCopySetTypes = testing::Types<ListHashSet<CountCopy>, using CountCopySetTypes = testing::Types<ListHashSet<CountCopy>,
ListHashSet<CountCopy, 1>, ListHashSet<CountCopy, 1>,
LinkedHashSet<CountCopy>, LegacyLinkedHashSet<CountCopy>,
NewLinkedHashSet<CountCopy>>; LinkedHashSet<CountCopy>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetCountCopyTest, CountCopySetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetCountCopyTest, CountCopySetTypes);
TYPED_TEST(ListOrLinkedHashSetCountCopyTest, TYPED_TEST(ListOrLinkedHashSetCountCopyTest,
...@@ -626,10 +625,10 @@ TYPED_TEST(ListOrLinkedHashSetCountCopyTest, MoveAssignmentShouldNotMakeACopy) { ...@@ -626,10 +625,10 @@ TYPED_TEST(ListOrLinkedHashSetCountCopyTest, MoveAssignmentShouldNotMakeACopy) {
template <typename Set> template <typename Set>
class ListOrLinkedHashSetMoveOnlyTest : public testing::Test {}; class ListOrLinkedHashSetMoveOnlyTest : public testing::Test {};
// TODO(bartekn): Add NewLinkedHashSet once it supports move-only type. // TODO(bartekn): Add LinkedHashSet once it supports move-only type.
using MoveOnlySetTypes = testing::Types<ListHashSet<MoveOnlyHashValue>, using MoveOnlySetTypes = testing::Types<ListHashSet<MoveOnlyHashValue>,
ListHashSet<MoveOnlyHashValue, 1>, ListHashSet<MoveOnlyHashValue, 1>,
LinkedHashSet<MoveOnlyHashValue>>; LegacyLinkedHashSet<MoveOnlyHashValue>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetMoveOnlyTest, MoveOnlySetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetMoveOnlyTest, MoveOnlySetTypes);
TYPED_TEST(ListOrLinkedHashSetMoveOnlyTest, MoveOnlyValue) { TYPED_TEST(ListOrLinkedHashSetMoveOnlyTest, MoveOnlyValue) {
...@@ -722,11 +721,11 @@ struct DefaultHash<InvalidZeroValue> { ...@@ -722,11 +721,11 @@ struct DefaultHash<InvalidZeroValue> {
template <typename Set> template <typename Set>
class ListOrLinkedHashSetInvalidZeroTest : public testing::Test {}; class ListOrLinkedHashSetInvalidZeroTest : public testing::Test {};
// NewLinkedHashSet is tested in NewLinkedHashSetEmptyTest.EmptyString // LinkedHashSet is tested in LinkedHashSetEmptyTest.EmptyString
using InvalidZeroValueSetTypes = using InvalidZeroValueSetTypes =
testing::Types<ListHashSet<InvalidZeroValue>, testing::Types<ListHashSet<InvalidZeroValue>,
ListHashSet<InvalidZeroValue, 1>, ListHashSet<InvalidZeroValue, 1>,
LinkedHashSet<InvalidZeroValue>>; LegacyLinkedHashSet<InvalidZeroValue>>;
TYPED_TEST_SUITE(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValueSetTypes); TYPED_TEST_SUITE(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValueSetTypes);
TYPED_TEST(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValue) { TYPED_TEST(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValue) {
......
...@@ -155,6 +155,10 @@ class VectorBackedLinkedList { ...@@ -155,6 +155,10 @@ class VectorBackedLinkedList {
private: private:
using Node = VectorBackedLinkedListNode<ValueType, Allocator>; using Node = VectorBackedLinkedListNode<ValueType, Allocator>;
// Using Vector like this (instead of HeapVector for garbage collected types)
// skips the checks for HeapVector in heap_allocator.h. This is necessary
// because HeapVector doesn't allow WeakMember, but we need to support
// VectorBackedLinkedList<WeakMember>.
using VectorType = Vector<Node, 0, Allocator>; using VectorType = Vector<Node, 0, Allocator>;
public: public:
...@@ -168,15 +172,6 @@ class VectorBackedLinkedList { ...@@ -168,15 +172,6 @@ class VectorBackedLinkedList {
using const_reverse_iterator = using const_reverse_iterator =
VectorBackedLinkedListConstReverseIterator<VectorBackedLinkedList>; VectorBackedLinkedListConstReverseIterator<VectorBackedLinkedList>;
VectorBackedLinkedList();
VectorBackedLinkedList(const VectorBackedLinkedList&) = default;
VectorBackedLinkedList(VectorBackedLinkedList&&) = default;
VectorBackedLinkedList& operator=(const VectorBackedLinkedList&) = default;
VectorBackedLinkedList& operator=(VectorBackedLinkedList&&) = default;
~VectorBackedLinkedList() = default;
void swap(VectorBackedLinkedList&); void swap(VectorBackedLinkedList&);
bool empty() const { return size_ == 0; } bool empty() const { return size_ == 0; }
...@@ -273,6 +268,22 @@ class VectorBackedLinkedList { ...@@ -273,6 +268,22 @@ class VectorBackedLinkedList {
#endif #endif
private: private:
// The constructors are private, because the class is used only by
// LinkedHashSet and we don't want it to be instantiated directly otherwise.
// There are a couple resonts for that:
// 1. We know that usage of VectorBackedLinkedList in LinkedHashSet is safe,
// since it is limited to Member and WeakMember for GCed sets. Other
// potential usages might not be safe.
// 2. LinkedHashSet relies on indices inside VectorBackedLinkedList not
// changing. Usage of VectorBackedLinkedList outside of LinkedHashSet may
// encourage code optimizations that may break that assumption.
VectorBackedLinkedList();
VectorBackedLinkedList(const VectorBackedLinkedList&) = default;
VectorBackedLinkedList(VectorBackedLinkedList&&) = default;
VectorBackedLinkedList& operator=(const VectorBackedLinkedList&) = default;
VectorBackedLinkedList& operator=(VectorBackedLinkedList&&) = default;
~VectorBackedLinkedList() = default;
bool IsFreeListEmpty() const { return free_head_index_ == anchor_index_; } bool IsFreeListEmpty() const { return free_head_index_ == anchor_index_; }
wtf_size_t UsedFirstIndex() const { wtf_size_t UsedFirstIndex() const {
...@@ -328,7 +339,19 @@ class VectorBackedLinkedList { ...@@ -328,7 +339,19 @@ class VectorBackedLinkedList {
#endif #endif
template <typename T, typename U, typename V> template <typename T, typename U, typename V>
friend class NewLinkedHashSet; friend class LinkedHashSet;
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, Insert);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, PushFront);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, PushBack);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, MoveTo);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, Erase);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, PopFront);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, PopBack);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, Clear);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, Iterator);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, ConstIterator);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, String);
FRIEND_TEST_ALL_PREFIXES(VectorBackedLinkedListTest, UniquePtr);
}; };
template <typename VectorBackedLinkedListType> template <typename VectorBackedLinkedListType>
......
...@@ -43,7 +43,7 @@ TEST(VectorBackedLinkedListTest, Insert) { ...@@ -43,7 +43,7 @@ TEST(VectorBackedLinkedListTest, Insert) {
} }
} }
TEST(VectorBackedLinkedList, PushFront) { TEST(VectorBackedLinkedListTest, PushFront) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -62,7 +62,7 @@ TEST(VectorBackedLinkedList, PushFront) { ...@@ -62,7 +62,7 @@ TEST(VectorBackedLinkedList, PushFront) {
} }
} }
TEST(VectorBackedLinkedList, PushBack) { TEST(VectorBackedLinkedListTest, PushBack) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -81,7 +81,7 @@ TEST(VectorBackedLinkedList, PushBack) { ...@@ -81,7 +81,7 @@ TEST(VectorBackedLinkedList, PushBack) {
} }
} }
TEST(VectorBackedLinkedList, MoveTo) { TEST(VectorBackedLinkedListTest, MoveTo) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -140,7 +140,7 @@ TEST(VectorBackedLinkedList, MoveTo) { ...@@ -140,7 +140,7 @@ TEST(VectorBackedLinkedList, MoveTo) {
EXPECT_EQ(*it, 2); EXPECT_EQ(*it, 2);
} }
TEST(VectorBackedLinkedList, Erase) { TEST(VectorBackedLinkedListTest, Erase) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -183,7 +183,7 @@ TEST(VectorBackedLinkedList, Erase) { ...@@ -183,7 +183,7 @@ TEST(VectorBackedLinkedList, Erase) {
EXPECT_EQ(list.back(), 6); EXPECT_EQ(list.back(), 6);
} }
TEST(VectorBackedLinkedList, PopFront) { TEST(VectorBackedLinkedListTest, PopFront) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -211,7 +211,7 @@ TEST(VectorBackedLinkedList, PopFront) { ...@@ -211,7 +211,7 @@ TEST(VectorBackedLinkedList, PopFront) {
EXPECT_TRUE(list.empty()); EXPECT_TRUE(list.empty());
} }
TEST(VectorBackedLinkedList, PopBack) { TEST(VectorBackedLinkedListTest, PopBack) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -233,7 +233,7 @@ TEST(VectorBackedLinkedList, PopBack) { ...@@ -233,7 +233,7 @@ TEST(VectorBackedLinkedList, PopBack) {
EXPECT_TRUE(list.empty()); EXPECT_TRUE(list.empty());
} }
TEST(VectorBackedLinkedList, Clear) { TEST(VectorBackedLinkedListTest, Clear) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -254,7 +254,7 @@ TEST(VectorBackedLinkedList, Clear) { ...@@ -254,7 +254,7 @@ TEST(VectorBackedLinkedList, Clear) {
EXPECT_EQ(list.size(), 1u); EXPECT_EQ(list.size(), 1u);
} }
TEST(VectorBackedLinkedList, Iterator) { TEST(VectorBackedLinkedListTest, Iterator) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -297,7 +297,7 @@ TEST(VectorBackedLinkedList, Iterator) { ...@@ -297,7 +297,7 @@ TEST(VectorBackedLinkedList, Iterator) {
EXPECT_EQ(*rit, 1); EXPECT_EQ(*rit, 1);
} }
TEST(VectorBackedLinkedList, ConstIterator) { TEST(VectorBackedLinkedListTest, ConstIterator) {
using List = VectorBackedLinkedList<int>; using List = VectorBackedLinkedList<int>;
List list; List list;
...@@ -333,7 +333,7 @@ TEST(VectorBackedLinkedList, ConstIterator) { ...@@ -333,7 +333,7 @@ TEST(VectorBackedLinkedList, ConstIterator) {
EXPECT_EQ(*crit, 1); EXPECT_EQ(*crit, 1);
} }
TEST(VectorBackedLinkedList, String) { TEST(VectorBackedLinkedListTest, String) {
using List = VectorBackedLinkedList<String>; using List = VectorBackedLinkedList<String>;
List list; List list;
...@@ -394,7 +394,7 @@ TEST(VectorBackedLinkedList, String) { ...@@ -394,7 +394,7 @@ TEST(VectorBackedLinkedList, String) {
EXPECT_TRUE(list.empty()); EXPECT_TRUE(list.empty());
} }
TEST(VectorBackedLinkedList, UniquePtr) { TEST(VectorBackedLinkedListTest, UniquePtr) {
using List = VectorBackedLinkedList<std::unique_ptr<Dummy>>; using List = VectorBackedLinkedList<std::unique_ptr<Dummy>>;
List list; List list;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment