Browse Source

AK: Make Bitmap movable but not copyable.

We were falling back to an incorrect compiler-generated copy ctor for
this class, and let's not do that.

Found by PVS-Studio.
Andreas Kling 6 years ago
parent
commit
a3ee35510f
1 changed files with 25 additions and 4 deletions
  1. 25 4
      AK/Bitmap.h

+ 25 - 4
AK/Bitmap.h

@@ -1,13 +1,15 @@
 #pragma once
 #pragma once
 
 
-#include "Assertions.h"
-#include "StdLibExtras.h"
-#include "Types.h"
-#include "kmalloc.h"
+#include <AK/Assertions.h>
+#include <AK/Noncopyable.h>
+#include <AK/StdLibExtras.h>
+#include <AK/Types.h>
+#include <AK/kmalloc.h>
 
 
 namespace AK {
 namespace AK {
 
 
 class Bitmap {
 class Bitmap {
+    AK_MAKE_NONCOPYABLE(Bitmap)
 public:
 public:
     // NOTE: A wrapping Bitmap won't try to free the wrapped data.
     // NOTE: A wrapping Bitmap won't try to free the wrapped data.
     static Bitmap wrap(u8* data, int size)
     static Bitmap wrap(u8* data, int size)
@@ -25,6 +27,25 @@ public:
         return Bitmap();
         return Bitmap();
     }
     }
 
 
+    Bitmap(Bitmap&& other)
+    {
+        m_owned = exchange(other.m_owned, false);
+        m_data = exchange(other.m_data, nullptr);
+        m_size = exchange(other.m_size, 0);
+    }
+
+    Bitmap& operator=(Bitmap&& other)
+    {
+        if (this != &other) {
+            if (m_owned)
+                kfree(m_data);
+            m_owned = exchange(other.m_owned, false);
+            m_data = exchange(other.m_data, nullptr);
+            m_size = exchange(other.m_size, 0);
+        }
+        return *this;
+    }
+
     ~Bitmap()
     ~Bitmap()
     {
     {
         if (m_owned)
         if (m_owned)