refactor SignalConnection class. 01/244201/5
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Tue, 15 Sep 2020 02:20:19 +0000 (11:20 +0900)
committerSubhransu Mohanty <sub.mohanty@samsung.com>
Wed, 7 Oct 2020 00:37:53 +0000 (09:37 +0900)
- make SignalConnection class a move-only type.
- with this change we can use this object as a valuetype
instead of pointer in the std::vector.

- this will reduce the heap allocation as well as search
  inside the container.

Change-Id: I87a0a4b38e979be23bfec75076fbda97ea73e932

dali/public-api/signals/signal-slot-connections.cpp
dali/public-api/signals/signal-slot-connections.h

index b03e133..589d0ef 100644 (file)
@@ -20,6 +20,7 @@
 
 // EXTERNAL INCLUDES
 #include <cstddef>
+#include <type_traits>
 
 // INTERNAL INCLUDES
 #include <dali/public-api/signals/callback.h>
@@ -46,25 +47,7 @@ SlotObserver* SlotConnection::GetSlotObserver()
   return mSlotObserver;
 }
 
-SignalConnection::SignalConnection(CallbackBase* callback)
-: mSignalObserver(nullptr),
-  mCallback(callback)
-{
-}
-
-SignalConnection::SignalConnection(SignalObserver* signalObserver, CallbackBase* callback)
-: mSignalObserver(signalObserver),
-  mCallback(callback)
-{
-}
-
-SignalConnection::~SignalConnection()
-{
-  // signal connections have ownership of the callback.
-  delete mCallback;
-}
-
-void SignalConnection::Disconnect(SlotObserver* slotObserver)
+void SignalConnection::Disconnect(SlotObserver* slotObserver) noexcept
 {
   if(mSignalObserver)
   {
@@ -78,9 +61,10 @@ void SignalConnection::Disconnect(SlotObserver* slotObserver)
   mCallback = nullptr;
 }
 
-CallbackBase* SignalConnection::GetCallback()
-{
-  return mCallback;
-}
+static_assert(std::is_nothrow_move_constructible_v<SignalConnection>);
+static_assert(std::is_nothrow_move_assignable_v<SignalConnection>);
+
+static_assert(std::is_copy_constructible_v<SignalConnection> == false);
+static_assert(std::is_copy_assignable_v<SignalConnection> == false);
 
 } // namespace Dali
index 2a76199..3b34459 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/public-api/signals/callback.h>
 #include <dali/public-api/signals/signal-slot-observers.h>
 
 namespace Dali
@@ -28,7 +29,6 @@ namespace Dali
  * @{
  */
 
-class CallbackBase;
 
 /**
  * @brief Slot connection is the connection information held by a connection tracker.
@@ -111,7 +111,10 @@ public:
    * @SINCE_1_0.0
    * @param[in] callback The callback which should be a C function
    */
-  SignalConnection(CallbackBase* callback);
+  SignalConnection(CallbackBase* callback) noexcept
+  : mCallback(callback)
+  {
+  }
 
   /**
    * @brief Constructor.
@@ -120,13 +123,21 @@ public:
    * @param[in] signalObserver The signal observer
    * @param[in] callback Ownership of this callback object is taken
    */
-  SignalConnection(SignalObserver* signalObserver, CallbackBase* callback);
+  SignalConnection(SignalObserver* signalObserver, CallbackBase* callback) noexcept
+  : mSignalObserver(signalObserver),
+    mCallback(callback)
+  {
+  }
 
   /**
    * @brief Non-virtual destructor, not intended as a base class.
    * @SINCE_1_0.0
    */
-  ~SignalConnection();
+  ~SignalConnection() noexcept
+  {
+    // signal connections have ownership of the callback.
+    delete mCallback;
+  }
 
   /**
    * @brief Disconnects the signal from the slot.
@@ -134,7 +145,7 @@ public:
    * @SINCE_1_0.0
    * @param[in] slotObserver The signal disconnecting from the slot
    */
-  void Disconnect(SlotObserver* slotObserver);
+  void Disconnect(SlotObserver* slotObserver) noexcept;
 
   /**
    * @brief Retrieves the callback.
@@ -142,17 +153,60 @@ public:
    * @SINCE_1_0.0
    * @return A pointer to the callback
    */
-  CallbackBase* GetCallback();
+  CallbackBase* GetCallback() const noexcept
+  {
+    return mCallback;
+  }
 
-private:
   SignalConnection(const SignalConnection&) = delete;            ///< Deleted copy constructor. @SINCE_1_0.0
-  SignalConnection(SignalConnection&&)      = delete;            ///< Deleted move constructor. @SINCE_1_9.25
   SignalConnection& operator=(const SignalConnection&) = delete; ///< Deleted copy assignment operator. @SINCE_1_0.0
-  SignalConnection& operator=(SignalConnection&&) = delete;      ///< Deleted move assignment operator. @SINCE_1_9.25
+
+  /**
+   * @brief Move constructor.
+   *
+   * A move constructor enables the resources owned by an rvalue object to be moved into an lvalue without copying.
+   * @SINCE_1_9.38
+   * @param[in] connection The property value to move from
+   */
+  SignalConnection(SignalConnection&& connection) noexcept
+  : mSignalObserver(connection.mSignalObserver),
+    mCallback(connection.mCallback)
+  {
+    connection.mSignalObserver = nullptr;
+    connection.mCallback       = nullptr;
+  }
+
+  /**
+   * @brief Move assignment operator.
+   *
+   * @SINCE_1_9.38
+   * @param[in] connection The connection to move from
+   * @return a reference to this
+   */
+  SignalConnection& operator=(SignalConnection&& connection) noexcept
+  {
+    if(this != &connection)
+    {
+      // release the callback
+      delete mCallback;
+
+      mSignalObserver = connection.mSignalObserver;
+      mCallback       = connection.mCallback;
+
+      connection.mSignalObserver = nullptr;
+      connection.mCallback       = nullptr;
+    }
+    return *this;
+  }
+
+  explicit operator bool() const noexcept
+  {
+    return mCallback ? true : false;
+  }
 
 private:
-  SignalObserver* mSignalObserver; ///< a pointer to the signal observer (not owned)
-  CallbackBase*   mCallback;       ///< The callback, has ownership.
+  SignalObserver* mSignalObserver{nullptr}; ///< a pointer to the signal observer (not owned)
+  CallbackBase*   mCallback{nullptr};       ///< The callback, has ownership.
 };
 
 /**