Updated all code to new format
[platform/core/uifw/dali-core.git] / dali / public-api / signals / base-signal.h
old mode 100755 (executable)
new mode 100644 (file)
index 5de0137..1e42e0b
@@ -1,8 +1,8 @@
-#ifndef __DALI_BASE_SIGNAL_H__
-#define __DALI_BASE_SIGNAL_H__
+#ifndef DALI_BASE_SIGNAL_H
+#define DALI_BASE_SIGNAL_H
 
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,9 @@
  *
  */
 
+// EXTERNAL INCLUDES
+#include <vector>
+
 // INTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
 #include <dali/public-api/common/dali-vector.h>
@@ -78,7 +81,6 @@ namespace Dali
 class DALI_CORE_API BaseSignal : public SlotObserver
 {
 public:
-
   /**
    * @brief Constructor.
    * @SINCE_1_0.0
@@ -89,7 +91,7 @@ public:
    * @brief Virtual destructor.
    * @SINCE_1_0.0
    */
-  virtual ~BaseSignal();
+  ~BaseSignal() override;
 
   /**
    * @brief Queries whether there are any connected slots.
@@ -97,7 +99,10 @@ public:
    * @SINCE_1_0.0
    * @return True if there are any slots connected to the signal.
    */
-  bool Empty() const;
+  bool Empty() const
+  {
+    return (0 == GetConnectionCount());
+  }
 
   /**
    * @brief Queries the number of slots.
@@ -105,7 +110,10 @@ public:
    * @SINCE_1_0.0
    * @return The number of slots connected to this signal
    */
-  std::size_t GetConnectionCount() const;
+  std::size_t GetConnectionCount() const
+  {
+    return mSignalConnections.size() - mNullConnections;
+  }
 
   // Templated Emit functions for the Signal implementations
 
@@ -121,7 +129,7 @@ public:
      * @SINCE_1_0.0
      * @param[in,out] flag This flag will be set to true during Emit() calls
      */
-    EmitGuard( bool& flag );
+    EmitGuard(bool& flag);
 
     /**
      * @brief Non-virtual destructor.
@@ -142,45 +150,38 @@ public:
   };
 
   /**
-   * @brief Emits a signal with no parameters.
+   * @brief Emits a signal with parameter pack.
    *
-   * @SINCE_1_0.0
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  void Emit();
-
-  /**
-   * @brief Emits a signal with no parameters.
-   *
-   * @SINCE_1_0.0
+   * @SINCE_1_9.33
+   * @param[in] args The parameter pack
    * @return The value returned by the last callback
    * @pre Cannot be called from inside the same Signal's Emit methods.
    */
-  template< typename Ret >
-  Ret EmitReturn()
+  template<typename Ret, typename... Args>
+  Ret EmitReturn(Args... args)
   {
     Ret returnVal = Ret();
 
     // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag );
-    if( guard.ErrorOccurred() )
+    EmitGuard guard(mEmittingFlag);
+    if(guard.ErrorOccurred())
     {
       return returnVal;
     }
 
     // If more connections are added by callbacks, these are ignore until the next Emit()
     // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
+    const std::size_t initialCount(mSignalConnections.size());
 
-    for( std::size_t i = 0; i < initialCount; ++i )
+    for(std::size_t i = 0; i < initialCount; ++i)
     {
-      CallbackBase* callback( GetCallback(i) );
+      CallbackBase* callback(GetCallback(i));
 
       // Note that connections will be set to NULL when disconnected
       // This is preferable to reducing the connection count while iterating
-      if( callback )
+      if(callback)
       {
-        returnVal = CallbackBase::ExecuteReturn<Ret>( *callback );
+        returnVal = CallbackBase::ExecuteReturn<Ret, Args...>(*callback, args...);
       }
     }
 
@@ -191,35 +192,35 @@ public:
   }
 
   /**
-   * @brief Emits a signal with 1 parameter.
+   * @brief Emits a signal with  parameter pack.
    *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
+   * @SINCE_1_9.33
+   * @param[in] args The parameter pack
    * @pre Cannot be called from inside the same Signal's Emit methods.
    */
-  template< typename Arg0 >
-  void Emit( Arg0 arg0 )
+  template<typename... Args>
+  void Emit(Args... args)
   {
     // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
+    EmitGuard guard(mEmittingFlag); // Guards against nested Emit() calls
+    if(guard.ErrorOccurred())
     {
       return;
     }
 
     // If more connections are added by callbacks, these are ignore until the next Emit()
     // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
+    const std::size_t initialCount(mSignalConnections.size());
 
-    for( std::size_t i = 0; i < initialCount; ++i )
+    for(std::size_t i = 0; i < initialCount; ++i)
     {
-      CallbackBase* callback( GetCallback(i) );
+      CallbackBase* callback(GetCallback(i));
 
       // Note that connections will be set to NULL when disconnected
       // This is preferable to reducing the connection count while iterating
-      if( callback )
+      if(callback)
       {
-        CallbackBase::Execute<Arg0 >( *callback, arg0 );
+        CallbackBase::Execute<Args...>(*callback, args...);
       }
     }
 
@@ -227,212 +228,6 @@ public:
     CleanupConnections();
   }
 
-  /**
-   * @brief Emits a signal with 1 parameter.
-   *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
-   * @return The value returned by the last callback
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  template< typename Ret, typename Arg0 >
-  Ret EmitReturn( Arg0 arg0 )
-  {
-    Ret returnVal = Ret();
-
-    // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
-    {
-      return returnVal;
-    }
-
-    // If more connections are added by callbacks, these are ignore until the next Emit()
-    // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
-
-    for( std::size_t i = 0; i < initialCount; ++i )
-    {
-      CallbackBase* callback( GetCallback(i) );
-
-      // Note that connections will be set to NULL when disconnected
-      // This is preferable to reducing the connection count while iterating
-      if( callback )
-      {
-        returnVal = CallbackBase::ExecuteReturn<Ret,Arg0>( *callback, arg0 );
-      }
-    }
-
-    // Cleanup NULL values from Connection container
-    CleanupConnections();
-
-    return returnVal;
-  }
-
-  /**
-   * @brief Emits a signal with 2 parameters.
-   *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
-   * @param[in] arg1 The second parameter
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  template< typename Arg0, typename Arg1 >
-  void Emit( Arg0 arg0, Arg1 arg1 )
-  {
-    // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
-    {
-      return;
-    }
-
-    // If more connections are added by callbacks, these are ignore until the next Emit()
-    // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
-
-    for( std::size_t i = 0; i < initialCount; ++i )
-    {
-      CallbackBase* callback( GetCallback(i) );
-
-      // Note that connections will be set to NULL when disconnected
-      // This is preferable to reducing the connection count while iterating
-      if( callback )
-      {
-        CallbackBase::Execute<Arg0,Arg1>( *callback, arg0, arg1 );
-      }
-    }
-
-    // Cleanup NULL values from Connection container
-    CleanupConnections();
-  }
-
-  /**
-   * @brief Emits a signal with 2 parameters.
-   *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
-   * @param[in] arg1 The second parameter
-   * @return The value returned by the last callback
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  template< typename Ret, typename Arg0, typename Arg1 >
-  Ret EmitReturn( Arg0 arg0, Arg1 arg1 )
-  {
-    Ret returnVal = Ret();
-
-    // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
-    {
-      return returnVal;
-    }
-
-    // If more connections are added by callbacks, these are ignore until the next Emit()
-    // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
-
-    for( std::size_t i = 0; i < initialCount; ++i )
-    {
-      CallbackBase* callback( GetCallback(i) );
-
-      // Note that connections will be set to NULL when disconnected
-      // This is preferable to reducing the connection count while iterating
-      if( callback )
-      {
-        returnVal = CallbackBase::ExecuteReturn<Ret,Arg0,Arg1>( *callback, arg0, arg1 );
-      }
-    }
-
-    // Cleanup NULL values from Connection container
-    CleanupConnections();
-
-    return returnVal;
-  }
-
-  /**
-   * @brief Emits a signal with 3 parameters.
-   *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
-   * @param[in] arg1 The second parameter
-   * @param[in] arg2 The third parameter
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  template< typename Arg0, typename Arg1, typename Arg2 >
-  void Emit( Arg0 arg0, Arg1 arg1, Arg2 arg2 )
-  {
-    // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
-    {
-      return;
-    }
-
-    // If more connections are added by callbacks, these are ignore until the next Emit()
-    // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
-
-    for( std::size_t i = 0; i < initialCount; ++i )
-    {
-      CallbackBase* callback( GetCallback(i) );
-
-      // Note that connections will be set to NULL when disconnected
-      // This is preferable to reducing the connection count while iterating
-      if( callback )
-      {
-        CallbackBase::Execute<Arg0,Arg1,Arg2>( *callback, arg0, arg1, arg2 );
-      }
-    }
-
-    // Cleanup NULL values from Connection container
-    CleanupConnections();
-  }
-
-  /**
-   * @brief Emits a signal with 3 parameters.
-   *
-   * @SINCE_1_0.0
-   * @param[in] arg0 The first parameter
-   * @param[in] arg1 The second parameter
-   * @param[in] arg2 The third parameter
-   * @return The value returned by the last callback
-   * @pre Cannot be called from inside the same Signal's Emit methods.
-   */
-  template< typename Ret, typename Arg0, typename Arg1, typename Arg2 >
-  Ret EmitReturn( Arg0 arg0, Arg1 arg1, Arg2 arg2 )
-  {
-    Ret returnVal = Ret();
-
-    // Guards against nested Emit() calls
-    EmitGuard guard( mEmittingFlag ); // Guards against nested Emit() calls
-    if( guard.ErrorOccurred() )
-    {
-      return returnVal;
-    }
-
-    // If more connections are added by callbacks, these are ignore until the next Emit()
-    // Note that count cannot be reduced while iterating
-    const std::size_t initialCount( mSignalConnections.Count() );
-
-    for( std::size_t i = 0; i < initialCount; ++i )
-    {
-      CallbackBase* callback( GetCallback(i) );
-
-      // Note that connections will be set to NULL when disconnected
-      // This is preferable to reducing the connection count while iterating
-      if( callback )
-      {
-        returnVal = CallbackBase::ExecuteReturn<Ret,Arg0,Arg1,Arg2>( *callback, arg0, arg1, arg2 );
-      }
-    }
-
-    // Cleanup NULL values from Connection container
-    CleanupConnections();
-
-    return returnVal;
-  }
-
   // Connect / Disconnect function for use by Signal implementations
 
   /**
@@ -441,7 +236,7 @@ public:
    * @SINCE_1_0.0
    * @param[in] callback A newly allocated callback object (takes ownership)
    */
-  void OnConnect( CallbackBase* callback );
+  void OnConnect(CallbackBase* callback);
 
   /**
    * @brief Called by Signal implementations, when the user calls Signal.Disconnect( ... ).
@@ -449,7 +244,7 @@ public:
    * @SINCE_1_0.0
    * @param[in] callback A newly allocated callback object (takes ownership)
    */
-  void OnDisconnect( CallbackBase* callback );
+  void OnDisconnect(CallbackBase* callback);
 
   /**
    * @brief Called by Signal implementations, when the user calls Signal.Connect( ... ).
@@ -458,7 +253,7 @@ public:
    * @param[in] tracker The connection tracker
    * @param[in] callback A newly allocated callback object (takes ownership)
    */
-  void OnConnect( ConnectionTrackerInterface* tracker, CallbackBase* callback );
+  void OnConnect(ConnectionTrackerInterface* tracker, CallbackBase* callback);
 
   /**
    * @brief Called by Signal implementations, when the user calls Signal.Disconnect( ... ).
@@ -467,17 +262,15 @@ public:
    * @param[in] tracker The connection tracker
    * @param[in] callback A newly allocated callback object (takes ownership)
    */
-  void OnDisconnect( ConnectionTrackerInterface* tracker, CallbackBase* callback );
+  void OnDisconnect(ConnectionTrackerInterface* tracker, CallbackBase* callback);
 
 private: // SlotObserver interface, to be told when a slot disconnects
-
   /**
    * @copydoc SlotObserver::SlotDisconnected
    */
-  virtual void SlotDisconnected( CallbackBase* callback );
+  void SlotDisconnected(CallbackBase* callback) override;
 
 private:
-
   /**
    * @brief Returns a callback given an index in to the connection array.
    *
@@ -485,7 +278,10 @@ private:
    * @param[in] connectionIndex The index of the callback
    * @return The callback, or NULL if the connection has been deleted
    */
-  CallbackBase* GetCallback( std::size_t connectionIndex ) const;
+  CallbackBase* GetCallback(std::size_t connectionIndex) const noexcept
+  {
+    return mSignalConnections[connectionIndex].GetCallback();
+  }
 
   /**
    * @brief Helper to find whether a callback is connected.
@@ -494,7 +290,7 @@ private:
    * @param[in] callback The call back object
    * @return A valid index if the callback is connected
    */
-  int32_t FindCallback( CallbackBase* callback );
+  int32_t FindCallback(CallbackBase* callback) const noexcept;
 
   /**
    * @brief Deletes a connection object from the list of connections.
@@ -502,7 +298,7 @@ private:
    * @SINCE_1_0.0
    * @param[in] connectionIndex The index of the callback
    */
-  void DeleteConnection( std::size_t connectionIndex );
+  void DeleteConnection(std::size_t connectionIndex);
 
   /**
    * @brief Helper to remove NULL items from mSignalConnections, which is only safe at the end of Emit()
@@ -511,14 +307,15 @@ private:
    */
   void CleanupConnections();
 
-  BaseSignal( const BaseSignal& );                   ///< undefined copy constructor, signals don't support copying. @SINCE_1_0.0
-  BaseSignal& operator=( const BaseSignal& );        ///< undefined assignment operator @SINCE_1_0.0
+  BaseSignal(const BaseSignal&) = delete;            ///< Deleted copy constructor, signals don't support copying. @SINCE_1_0.0
+  BaseSignal(BaseSignal&&)      = delete;            ///< Deleted move constructor, signals don't support moving. @SINCE_1_9.25
+  BaseSignal& operator=(const BaseSignal&) = delete; ///< Deleted copy assignment operator. @SINCE_1_0.0
+  BaseSignal& operator=(BaseSignal&&) = delete;      ///< Deleted move assignment operator. @SINCE_1_9.25
 
 private:
-
-  Dali::Vector< SignalConnection* > mSignalConnections;   ///< Array of connections
-
-  bool mEmittingFlag; ///< Used to guard against nested Emit() calls
+  std::vector<SignalConnection> mSignalConnections;   ///< Array of connections
+  uint32_t                      mNullConnections{0};  ///< Empty Connections in the array.
+  bool                          mEmittingFlag{false}; ///< Used to guard against nested Emit() calls
 };
 
 /**
@@ -526,4 +323,4 @@ private:
  */
 } // namespace Dali
 
-#endif // __DALI_BASE_SIGNAL_H__
+#endif // DALI_BASE_SIGNAL_H