浏览代码

AK: Add NonnullOwnPtr::swap() as well for symmetry

Andreas Kling 5 年之前
父节点
当前提交
d394267f50
共有 1 个文件被更改,包括 21 次插入10 次删除
  1. 21 10
      AK/NonnullOwnPtr.h

+ 21 - 10
AK/NonnullOwnPtr.h

@@ -100,11 +100,8 @@ public:
     RETURN_TYPESTATE(unconsumed)
     NonnullOwnPtr& operator=(NonnullOwnPtr&& other)
     {
-        if (this != &other) {
-            delete m_ptr;
-            m_ptr = other.leak_ptr();
-            ASSERT(m_ptr);
-        }
+        NonnullOwnPtr ptr(move(other));
+        swap(ptr);
         return *this;
     }
 
@@ -112,11 +109,8 @@ public:
     RETURN_TYPESTATE(unconsumed)
     NonnullOwnPtr& operator=(NonnullOwnPtr<U>&& other)
     {
-        if (this != static_cast<void*>(&other)) {
-            delete m_ptr;
-            m_ptr = other.leak_ptr();
-            ASSERT(m_ptr);
-        }
+        NonnullOwnPtr ptr(move(other));
+        swap(ptr);
         return *this;
     }
 
@@ -150,6 +144,17 @@ public:
     operator bool() const = delete;
     bool operator!() const = delete;
 
+    void swap(NonnullOwnPtr& other)
+    {
+        ::swap(m_ptr, other.m_ptr);
+    }
+
+    template<typename U>
+    void swap(NonnullOwnPtr<U>& other)
+    {
+        ::swap(m_ptr, other.m_ptr);
+    }
+
 private:
     void clear()
     {
@@ -183,6 +188,12 @@ inline const LogStream& operator<<(const LogStream& stream, const NonnullOwnPtr<
     return stream << value.ptr();
 }
 
+template<typename T, typename U>
+inline void swap(NonnullOwnPtr<T>& a, NonnullOwnPtr<U>& b)
+{
+    a.swap(b);
+}
+
 }
 
 using AK::make;