Modified: trunk/Source/WTF/wtf/ListHashSet.h (203324 => 203325)
--- trunk/Source/WTF/wtf/ListHashSet.h 2016-07-16 15:21:55 UTC (rev 203324)
+++ trunk/Source/WTF/wtf/ListHashSet.h 2016-07-16 16:33:11 UTC (rev 203325)
@@ -19,8 +19,7 @@
*
*/
-#ifndef WTF_ListHashSet_h
-#define WTF_ListHashSet_h
+#pragma once
#include <wtf/HashSet.h>
@@ -69,9 +68,11 @@
typedef HashTableAddResult<iterator> AddResult;
- ListHashSet();
+ ListHashSet() = default;
ListHashSet(const ListHashSet&);
+ ListHashSet(ListHashSet&&);
ListHashSet& operator=(const ListHashSet&);
+ ListHashSet& operator=(ListHashSet&&);
~ListHashSet();
void swap(ListHashSet&);
@@ -149,8 +150,8 @@
const_iterator makeConstIterator(Node*) const;
HashTable<Node*, Node*, IdentityExtractor, NodeHash, NodeTraits, NodeTraits> m_impl;
- Node* m_head;
- Node* m_tail;
+ Node* m_head { nullptr };
+ Node* m_tail { nullptr };
};
template<typename ValueArg> struct ListHashSetNode {
@@ -159,14 +160,12 @@
template<typename T>
ListHashSetNode(T&& value)
: m_value(std::forward<T>(value))
- , m_prev(0)
- , m_next(0)
{
}
ValueArg m_value;
- ListHashSetNode* m_prev;
- ListHashSetNode* m_next;
+ ListHashSetNode* m_prev { nullptr };
+ ListHashSetNode* m_next { nullptr };
};
template<typename HashArg> struct ListHashSetNodeHashFunctions {
@@ -260,7 +259,7 @@
const_iterator& operator++()
{
- ASSERT(m_position != 0);
+ ASSERT(m_position);
m_position = m_position->m_next;
return *this;
}
@@ -307,16 +306,7 @@
};
template<typename T, typename U>
-inline ListHashSet<T, U>::ListHashSet()
- : m_head(0)
- , m_tail(0)
-{
-}
-
-template<typename T, typename U>
inline ListHashSet<T, U>::ListHashSet(const ListHashSet& other)
- : m_head(0)
- , m_tail(0)
{
for (auto it = other.begin(), end = other.end(); it != end; ++it)
add(*it);
@@ -331,6 +321,23 @@
}
template<typename T, typename U>
+inline ListHashSet<T, U>::ListHashSet(ListHashSet&& other)
+ : m_impl(WTFMove(other.m_impl))
+ , m_head(std::exchange(other.m_head, nullptr))
+ , m_tail(std::exchange(other.m_tail, nullptr))
+{
+}
+
+template<typename T, typename U>
+inline ListHashSet<T, U>& ListHashSet<T, U>::operator=(ListHashSet&& other)
+{
+ m_impl = WTFMove(other.m_impl);
+ m_head = std::exchange(other.m_head, nullptr);
+ m_tail = std::exchange(other.m_tail, nullptr);
+ return *this;
+}
+
+template<typename T, typename U>
inline void ListHashSet<T, U>::swap(ListHashSet& other)
{
m_impl.swap(other.m_impl);
@@ -602,8 +609,8 @@
{
deleteAllNodes();
m_impl.clear();
- m_head = 0;
- m_tail = 0;
+ m_head = nullptr;
+ m_tail = nullptr;
}
template<typename T, typename U>
@@ -637,7 +644,7 @@
void ListHashSet<T, U>::appendNode(Node* node)
{
node->m_prev = m_tail;
- node->m_next = 0;
+ node->m_next = nullptr;
if (m_tail) {
ASSERT(m_head);
@@ -653,7 +660,7 @@
template<typename T, typename U>
void ListHashSet<T, U>::prependNode(Node* node)
{
- node->m_prev = 0;
+ node->m_prev = nullptr;
node->m_next = m_head;
if (m_head)
@@ -686,7 +693,7 @@
if (!m_head)
return;
- for (Node* node = m_head, *next = m_head->m_next; node; node = next, next = node ? node->m_next : 0)
+ for (Node* node = m_head, *next = m_head->m_next; node; node = next, next = node ? node->m_next : nullptr)
delete node;
}
@@ -705,5 +712,3 @@
} // namespace WTF
using WTF::ListHashSet;
-
-#endif /* WTF_ListHashSet_h */
Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp (203324 => 203325)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp 2016-07-16 15:21:55 UTC (rev 203324)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp 2016-07-16 16:33:11 UTC (rev 203325)
@@ -266,4 +266,86 @@
ASSERT_TRUE(list.isEmpty());
}
+TEST(WTF_ListHashSet, MoveConstructor)
+{
+ ListHashSet<int> list;
+ list.add(1);
+ list.add(2);
+ list.add(3);
+
+ ASSERT_EQ(3U, list.size());
+ auto iterator = list.begin();
+ ASSERT_EQ(1, *iterator);
+ ++iterator;
+ ASSERT_EQ(2, *iterator);
+ ++iterator;
+ ASSERT_EQ(3, *iterator);
+ ++iterator;
+
+ ListHashSet<int> list2(WTFMove(list));
+ ASSERT_EQ(3U, list2.size());
+ auto iterator2 = list2.begin();
+ ASSERT_EQ(1, *iterator2);
+ ++iterator2;
+ ASSERT_EQ(2, *iterator2);
+ ++iterator2;
+ ASSERT_EQ(3, *iterator2);
+ ++iterator2;
+
+ ASSERT_EQ(0U, list.size());
+ ASSERT_TRUE(list.begin() == list.end());
+ list.add(4);
+ list.add(5);
+ list.add(6);
+ iterator = list.begin();
+ ASSERT_EQ(4, *iterator);
+ ++iterator;
+ ASSERT_EQ(5, *iterator);
+ ++iterator;
+ ASSERT_EQ(6, *iterator);
+ ++iterator;
+}
+
+TEST(WTF_ListHashSet, MoveAssignment)
+{
+ ListHashSet<int> list;
+ list.add(1);
+ list.add(2);
+ list.add(3);
+
+ ASSERT_EQ(3U, list.size());
+ auto iterator = list.begin();
+ ASSERT_EQ(1, *iterator);
+ ++iterator;
+ ASSERT_EQ(2, *iterator);
+ ++iterator;
+ ASSERT_EQ(3, *iterator);
+ ++iterator;
+
+ ListHashSet<int> list2;
+ list2.add(10);
+ list2 = (WTFMove(list));
+ ASSERT_EQ(3U, list2.size());
+ auto iterator2 = list2.begin();
+ ASSERT_EQ(1, *iterator2);
+ ++iterator2;
+ ASSERT_EQ(2, *iterator2);
+ ++iterator2;
+ ASSERT_EQ(3, *iterator2);
+ ++iterator2;
+
+ ASSERT_EQ(0U, list.size());
+ ASSERT_TRUE(list.begin() == list.end());
+ list.add(4);
+ list.add(5);
+ list.add(6);
+ iterator = list.begin();
+ ASSERT_EQ(4, *iterator);
+ ++iterator;
+ ASSERT_EQ(5, *iterator);
+ ++iterator;
+ ASSERT_EQ(6, *iterator);
+ ++iterator;
+}
+
} // namespace TestWebKitAPI