Merge "Make mTargetSizeDirtyFlag true when Animation changes Actor's Size" into devel...
[platform/core/uifw/dali-core.git] / dali / public-api / animation / constraint.h
index 1c336a1..6bdcb7c 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_CONSTRAINT_H__
-#define __DALI_CONSTRAINT_H__
+#ifndef DALI_CONSTRAINT_H
+#define DALI_CONSTRAINT_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
  *
  */
 
+// EXTERNAL INCLUDES
+#include <cstdint> // uint32_t
+
 // INTERNAL INCLUDES
 #include <dali/public-api/animation/constraint-source.h>
 #include <dali/public-api/common/dali-vector.h>
 #include <dali/public-api/object/base-handle.h>
-#include <dali/public-api/object/property.h>
 #include <dali/public-api/object/property-input.h>
+#include <dali/public-api/object/property.h>
 #include <dali/public-api/signals/callback.h>
 
 namespace Dali
@@ -40,7 +43,7 @@ namespace Internal DALI_INTERNAL
 class ConstraintBase;
 }
 
-typedef Vector< PropertyInput* > PropertyInputContainer;
+using PropertyInputContainer = Vector<PropertyInput*>;
 
 /**
  * @brief An abstract base class for Constraints.
@@ -65,10 +68,9 @@ typedef Vector< PropertyInput* > PropertyInputContainer;
  * @endcode
  * @SINCE_1_0.0
  */
-class DALI_IMPORT_API Constraint : public BaseHandle
+class DALI_CORE_API Constraint : public BaseHandle
 {
 public:
-
   /**
    * @brief Template for the Function that is called by the Constraint system.
    *
@@ -88,14 +90,13 @@ public:
    * should change this value to the desired one. The PropertyInputContainer is a const reference to the property inputs
    * added to the Constraint in the order they were added via AddSource().
    *
-   * @tparam  P  The property type to constrain.
    * @SINCE_1_0.0
+   * @tparam P The property type to constrain
    */
-  template< typename P >
+  template<typename P>
   class DALI_INTERNAL Function : public CallbackBase
   {
   public:
-
     /**
      * @brief Constructor which connects to the provided C function (or a static member function).
      *
@@ -105,11 +106,11 @@ public:
      * @endcode
      *
      * @SINCE_1_0.0
-     * @param[in]  function  The function to call.
+     * @param[in] function The function to call
      */
-    Function( void( *function )( P&, const PropertyInputContainer& ) )
-    : CallbackBase( reinterpret_cast< CallbackBase::Function >( function ) ),
-      mCopyConstructorDispatcher( NULL )
+    Function(void (*function)(P&, const PropertyInputContainer&))
+    : CallbackBase(reinterpret_cast<CallbackBase::Function>(function)),
+      mCopyConstructorDispatcher(NULL)
     {
     }
 
@@ -122,17 +123,16 @@ public:
      * @endcode
      *
      * @SINCE_1_0.0
-     * @param[in]  object  The object to copy.
-     *
-     * @tparam  T  The type of the object.
+     * @param[in] object The object to copy
+     * @tparam T The type of the object
      */
-    template< class T >
-    Function( const T& object )
-    : CallbackBase( reinterpret_cast< void* >( new T( object ) ), // copy the object
-                    NULL, // uses operator() instead of member function
-                    reinterpret_cast< CallbackBase::Dispatcher >( &FunctorDispatcher2< T, P&, const PropertyInputContainer& >::Dispatch ),
-                    reinterpret_cast< CallbackBase::Destructor >( &Destroyer< T >::Delete ) ),
-      mCopyConstructorDispatcher( reinterpret_cast< CopyConstructorDispatcher >( &ObjectCopyConstructorDispatcher< T >::Copy ) )
+    template<class T>
+    Function(const T& object)
+    : CallbackBase(reinterpret_cast<void*>(new T(object)), // copy the object
+                   nullptr,                                // uses operator() instead of member function
+                   reinterpret_cast<CallbackBase::Dispatcher>(&FunctorDispatcher2<T, P&, const PropertyInputContainer&>::Dispatch),
+                   reinterpret_cast<CallbackBase::Destructor>(&Destroyer<T>::Delete)),
+      mCopyConstructorDispatcher(reinterpret_cast<CopyConstructorDispatcher>(&ObjectCopyConstructorDispatcher<T>::Copy))
     {
     }
 
@@ -145,18 +145,17 @@ public:
      * @endcode
      *
      * @SINCE_1_0.0
-     * @param[in]  object          The object to copy.
-     * @param[in]  memberFunction  The member function to call. This has to be a member of the same class.
-     *
-     * @tparam  T  The type of the object.
+     * @param[in] object The object to copy
+     * @param[in] memberFunction The member function to call. This has to be a member of the same class
+     * @tparam T The type of the object
      */
-    template< class T >
-    Function( const T& object, void ( T::*memberFunction ) ( P&, const PropertyInputContainer& ) )
-    : CallbackBase( reinterpret_cast< void* >( new T( object ) ), // copy the object
-                    reinterpret_cast< CallbackBase::MemberFunction >( memberFunction ),
-                    reinterpret_cast< CallbackBase::Dispatcher >( &Dispatcher2< T, P&, const PropertyInputContainer& >::Dispatch ),
-                    reinterpret_cast< CallbackBase::Destructor >( &Destroyer< T >::Delete ) ),
-      mCopyConstructorDispatcher( reinterpret_cast< CopyConstructorDispatcher >( &ObjectCopyConstructorDispatcher< T >::Copy ) )
+    template<class T>
+    Function(const T& object, void (T::*memberFunction)(P&, const PropertyInputContainer&))
+    : CallbackBase(reinterpret_cast<void*>(new T(object)), // copy the object
+                   reinterpret_cast<CallbackBase::MemberFunction>(memberFunction),
+                   reinterpret_cast<CallbackBase::Dispatcher>(&Dispatcher2<T, P&, const PropertyInputContainer&>::Dispatch),
+                   reinterpret_cast<CallbackBase::Destructor>(&Destroyer<T>::Delete)),
+      mCopyConstructorDispatcher(reinterpret_cast<CopyConstructorDispatcher>(&ObjectCopyConstructorDispatcher<T>::Copy))
     {
     }
 
@@ -166,28 +165,27 @@ public:
      * The object, if held by this object, is also copied.
      *
      * @SINCE_1_0.0
-     * @return A pointer to a newly-allocation Function.
+     * @return A pointer to a newly-allocated Function
      */
     CallbackBase* Clone()
     {
-      CallbackBase* callback = NULL;
-      if ( mImpl && mImpl->mObjectPointer && mCopyConstructorDispatcher )
+      CallbackBase* callback = nullptr;
+      if(mImpl.mObjectPointer && mCopyConstructorDispatcher)
       {
-        callback = new Function( mCopyConstructorDispatcher( reinterpret_cast< UndefinedClass* >( mImpl->mObjectPointer ) ) /* Copy the object */,
-                                 mMemberFunction,
-                                 mImpl->mMemberFunctionDispatcher,
-                                 mImpl->mDestructorDispatcher,
-                                 mCopyConstructorDispatcher );
+        callback = new Function(mCopyConstructorDispatcher(reinterpret_cast<UndefinedClass*>(mImpl.mObjectPointer)) /* Copy the object */,
+                                mMemberFunction,
+                                mImpl.mMemberFunctionDispatcher,
+                                mImpl.mDestructorDispatcher,
+                                mCopyConstructorDispatcher);
       }
       else
       {
-        callback = new Function( mFunction );
+        callback = new Function(mFunction);
       }
       return callback;
     }
 
   private:
-
     /**
      * @brief Must not be declared.
      *
@@ -196,64 +194,56 @@ public:
     class UndefinedClass;
 
     /**
-     * @brief Used to call the function to copy the stored object
+     * @brief Used to call the function to copy the stored object.
      * @SINCE_1_0.0
      */
-    typedef UndefinedClass* (*CopyConstructorDispatcher) ( UndefinedClass* object );
+    using CopyConstructorDispatcher = UndefinedClass* (*)(UndefinedClass*);
 
     /**
      * @brief Copies the actual object in Constraint::Function.
      *
-     * @tparam  T  The type of the object.
      * @SINCE_1_0.0
+        * @tparam T The type of the object
      */
-    template< class T >
+    template<class T>
     struct ObjectCopyConstructorDispatcher
     {
       /**
-       * @brief Copy the object stored in Constraint::Function.
+       * @brief Copies the object stored in Constraint::Function.
        *
        * @SINCE_1_0.0
-       * @param[in]  object  The object to copy.
-       *
-       * @return Newly allocated clone of the object.
+       * @param[in] object The object to copy
+       * @return Newly allocated clone of the object
        */
-      static UndefinedClass* Copy( const UndefinedClass* object )
+      static UndefinedClass* Copy(const UndefinedClass* object)
       {
-        T* copy = new T( *( reinterpret_cast< const T* >( object ) ) );
-        return reinterpret_cast< UndefinedClass* >( copy );
+        T* copy = new T(*(reinterpret_cast<const T*>(object)));
+        return reinterpret_cast<UndefinedClass*>(copy);
       }
     };
 
-    /**
-     * @brief Undefined copy constructor
-     * @SINCE_1_0.0
-     */
-    Function( const Function& );
-
-    /**
-     * @brief Undefined assignment operator
-     * @SINCE_1_0.0
-     */
-    Function& operator=( const Function& );
+    Function(const Function&) = delete;            ///< Deleted copy constructor. @SINCE_1_0.0
+    Function(Function&&)      = delete;            ///< Deleted move constructor. @SINCE_1_9.25
+    Function& operator=(const Function&) = delete; ///< Deleted copy assignment operator. @SINCE_1_0.0
+    Function& operator=(Function&&) = delete;      ///< Deleted move assignment operator. @SINCE_1_9.25
 
     /**
      * @brief Constructor used when copying the stored object.
      *
      * @SINCE_1_0.0
      * @param[in]  object                     A newly copied object
-     * @param[in]  memberFunction             The member function of the object.
-     * @param[in]  dispatcher                 Used to call the actual object.
-     * @param[in]  destructor                 Used to delete the owned object.
-     * @param[in]  copyConstructorDispatcher  Used to create a copy of the owned object.
+     * @param[in]  memberFunction             The member function of the object
+     * @param[in]  dispatcher                 Used to call the actual object
+     * @param[in]  destructor                 Used to delete the owned object
+     * @param[in]  copyConstructorDispatcher  Used to create a copy of the owned object
      */
-    Function( void* object,
-              CallbackBase::MemberFunction memberFunction,
-              CallbackBase::Dispatcher dispatcher,
-              CallbackBase::Destructor destructor,
-              CopyConstructorDispatcher copyConstructorDispatcher )
-    : CallbackBase( object, memberFunction, dispatcher, destructor ),
-      mCopyConstructorDispatcher( copyConstructorDispatcher )
+    Function(void*                        object,
+             CallbackBase::MemberFunction memberFunction,
+             CallbackBase::Dispatcher     dispatcher,
+             CallbackBase::Destructor     destructor,
+             CopyConstructorDispatcher    copyConstructorDispatcher)
+    : CallbackBase(object, memberFunction, dispatcher, destructor),
+      mCopyConstructorDispatcher(copyConstructorDispatcher)
     {
     }
 
@@ -261,11 +251,11 @@ public:
      * @brief Constructor used when copying a simple stored function.
      *
      * @SINCE_1_0.0
-     * @param[in]  function   The function to call.
+     * @param[in] function The function to call
      */
-    Function( CallbackBase::Function function )
-    : CallbackBase( function ),
-      mCopyConstructorDispatcher( NULL )
+    Function(CallbackBase::Function function)
+    : CallbackBase(function),
+      mCopyConstructorDispatcher(nullptr)
     {
     }
 
@@ -275,7 +265,7 @@ public:
   };
 
   /**
-   * @brief The action that will happen when the constraint is removed.
+   * @brief Enumeration for the action that will happen when the constraint is removed.
    *
    * The final value may be "baked" i.e. saved permanently.
    * Alternatively the constrained value may be discarded when the constraint is removed.
@@ -283,14 +273,14 @@ public:
    */
   enum RemoveAction
   {
-    Bake,   ///< When the constraint is fully-applied, the constrained value is saved. @SINCE_1_0.0
-    Discard ///< When the constraint is removed, the constrained value is discarded. @SINCE_1_0.0
+    BAKE,   ///< When the constraint is fully-applied, the constrained value is saved. @SINCE_1_9.28
+    DISCARD ///< When the constraint is removed, the constrained value is discarded. @SINCE_1_9.28
   };
 
-  static const RemoveAction  DEFAULT_REMOVE_ACTION;  ///< Bake
+  static const RemoveAction DEFAULT_REMOVE_ACTION; ///< BAKE
 
   /**
-   * @brief Create an uninitialized Constraint; this can be initialized with Constraint::New().
+   * @brief Creates an uninitialized Constraint; this can be initialized with Constraint::New().
    *
    * Calling member functions with an uninitialized Constraint handle is not allowed.
    * @SINCE_1_0.0
@@ -298,7 +288,7 @@ public:
   Constraint();
 
   /**
-   * @brief Create a constraint which targets a property using a function or a static class member.
+   * @brief Creates a constraint which targets a property using a function or a static class member.
    *
    * The expected signature, for a Vector3 type for example, of the function is:
    * @code
@@ -312,22 +302,22 @@ public:
    * @endcode
    *
    * @SINCE_1_0.0
-   * @param[in]  handle       The handle to the property-owning object.
-   * @param[in]  targetIndex  The index of the property to constrain.
-   * @param[in]  function     The function to call to set the constrained property value.
-   * @return The new constraint.
+   * @param[in] handle      The handle to the property-owning object
+   * @param[in] targetIndex The index of the property to constrain
+   * @param[in] function    The function to call to set the constrained property value
    *
-   * @tparam P The type of the property to constrain.
+   * @tparam P The type of the property to constrain
+   * @return The new constraint
    */
-  template< class P >
-  static Constraint New( Handle handle, Property::Index targetIndex, void( *function )( P&, const PropertyInputContainer& ) )
+  template<class P>
+  static Constraint New(Handle handle, Property::Index targetIndex, void (*function)(P&, const PropertyInputContainer&))
   {
-    CallbackBase* callback = new Constraint::Function< P >( function );
-    return New( handle, targetIndex, PropertyTypes::Get< P >(), callback );
+    CallbackBase* callback = new Constraint::Function<P>(function);
+    return New(handle, targetIndex, PropertyTypes::Get<P>(), callback);
   }
 
   /**
-   * @brief Create a constraint which targets a property using a functor object.
+   * @brief Creates a constraint which targets a property using a functor object.
    *
    * The expected structure, for a Vector3 type for example, of the functor object is:
    * @code
@@ -344,23 +334,23 @@ public:
    * @endcode
    *
    * @SINCE_1_0.0
-   * @param[in]  handle       The handle to the property-owning object.
-   * @param[in]  targetIndex  The index of the property to constrain.
-   * @param[in]  object       The functor object whose functor is called to set the constrained property value.
-   * @return The new constraint.
+   * @param[in] handle      The handle to the property-owning object
+   * @param[in] targetIndex The index of the property to constraint
+   * @param[in] object      The functor object whose functor is called to set the constrained property value
    *
-   * @tparam P The type of the property to constrain.
-   * @tparam T The type of the object.
+   * @tparam P The type of the property to constrain
+   * @tparam T The type of the object
+   * @return The new constraint
    */
-  template< class P, class T >
-  static Constraint New( Handle handle, Property::Index targetIndex, const T& object )
+  template<class P, class T>
+  static Constraint New(Handle handle, Property::Index targetIndex, const T& object)
   {
-    CallbackBase* function = new Constraint::Function< P >( object );
-    return New( handle, targetIndex, PropertyTypes::Get< P >(), function );
+    CallbackBase* function = new Constraint::Function<P>(object);
+    return New(handle, targetIndex, PropertyTypes::Get<P>(), function);
   }
 
   /**
-   * @brief Create a constraint which targets a property using an object method.
+   * @brief Creates a constraint which targets a property using an object method.
    *
    * The expected structure, for a Vector3 type for example, of the object is:
    * @code
@@ -377,34 +367,33 @@ public:
    * @endcode
    *
    * @SINCE_1_0.0
-   * @param[in]  handle          The handle to the property-owning object.
-   * @param[in]  targetIndex     The index of the property to constrain.
-   * @param[in]  object          The object whose member function is called to set the constrained property value.
-   * @param[in]  memberFunction  The member function to call to set the constrained property value.
-   * @return The new constraint.
-   *
-   * @tparam P The type of the property to constrain.
-   * @tparam T The type of the object.
+   * @param[in] handle         The handle to the property-owning object
+   * @param[in] targetIndex    The index of the property to constraint
+   * @param[in] object         The object whose member function is called to set the constrained property value
+   * @param[in] memberFunction The member function to call to set the constrained property value
+   * @return The new constraint
+   *
+   * @tparam P The type of the property to constrain
+   * @tparam T The type of the object
    */
-  template< class P, class T >
-  static Constraint New( Handle handle, Property::Index targetIndex, const T& object, void ( T::*memberFunction ) ( P&, const PropertyInputContainer& ) )
+  template<class P, class T>
+  static Constraint New(Handle handle, Property::Index targetIndex, const T& object, void (T::*memberFunction)(P&, const PropertyInputContainer&))
   {
-    CallbackBase* function = new Constraint::Function< P >( object, memberFunction );
-    return New( handle, targetIndex, PropertyTypes::Get< P >(), function );
+    CallbackBase* function = new Constraint::Function<P>(object, memberFunction);
+    return New(handle, targetIndex, PropertyTypes::Get<P>(), function);
   }
 
   /**
-   * @brief Creates a clones of this constraint for another object.
+   * @brief Creates a clone of this constraint for another object.
    *
    * @SINCE_1_0.0
-   * @param[in]  handle  The handle to the property-owning object this constraint is to be cloned for.
-   *
-   * @return The new constraint.
+   * @param[in] handle The handle to the property-owning object this constraint is to be cloned for
+   * @return The new constraint
    */
-  Constraint Clone( Handle handle );
+  Constraint Clone(Handle handle);
 
   /**
-   * @brief Destructor
+   * @brief Destructor.
    *
    * This is non-virtual since derived Handle types must not contain data or virtual methods.
    * @SINCE_1_0.0
@@ -415,45 +404,62 @@ public:
    * @brief This copy constructor is required for (smart) pointer semantics.
    *
    * @SINCE_1_0.0
-   * @param [in]  constraint  A reference to the copied handle
+   * @param[in] constraint A reference to the copied handle
    */
-  Constraint( const Constraint& constraint );
+  Constraint(const Constraint& constraint);
 
   /**
    * @brief This assignment operator is required for (smart) pointer semantics.
    *
    * @SINCE_1_0.0
-   * @param [in] rhs  A reference to the copied handle
+   * @param[in] rhs A reference to the copied handle
    * @return A reference to this
    */
-  Constraint& operator=( const Constraint& rhs );
+  Constraint& operator=(const Constraint& rhs);
+
+  /**
+   * @brief Move constructor.
+   *
+   * @SINCE_1_9.22
+   * @param[in] rhs A reference to the moved handle
+   */
+  Constraint(Constraint&& rhs);
 
   /**
-   * @brief Downcast a handle to Constraint handle.
+   * @brief Move assignment operator.
    *
-   * If handle points to a Constraint object the
-   * downcast produces valid handle. If not the returned handle is left uninitialized.
+   * @SINCE_1_9.22
+   * @param[in] rhs A reference to the moved handle
+   * @return A reference to this handle
+   */
+  Constraint& operator=(Constraint&& rhs);
+
+  /**
+   * @brief Downcasts a handle to Constraint handle.
+   *
+   * If handle points to a Constraint object, the downcast produces valid handle.
+   * If not, the returned handle is left uninitialized.
    * @SINCE_1_0.0
    * @param[in] baseHandle BaseHandle to an object
    * @return Handle to a Constraint object or an uninitialized handle
    */
-  static Constraint DownCast( BaseHandle baseHandle );
+  static Constraint DownCast(BaseHandle baseHandle);
 
   /**
-   * @brief Adds a constraint source to the constraint
+   * @brief Adds a constraint source to the constraint.
    *
    * @SINCE_1_0.0
    * @param[in] source The constraint source input to add
    */
-  void AddSource( ConstraintSource source );
+  void AddSource(ConstraintSource source);
 
   /**
    * @brief Applies this constraint.
    *
    * @SINCE_1_0.0
-   * @pre The constraint must be initialized
-   * @pre The target object must still be alive
-   * @pre The source inputs should not have been destroyed
+   * @pre The constraint must be initialized.
+   * @pre The target object must still be alive.
+   * @pre The source inputs should not have been destroyed.
    */
   void Apply();
 
@@ -464,80 +470,78 @@ public:
   void Remove();
 
   /**
-   * @brief Retrieve the object which this constraint is targeting.
+   * @brief Retrieves the object which this constraint is targeting.
    *
    * @SINCE_1_0.0
-   * @return The target object.
+   * @return The target object
    */
   Handle GetTargetObject();
 
   /**
-   * @brief Retrieve the property which this constraint is targeting.
+   * @brief Retrieves the property which this constraint is targeting.
    *
    * @SINCE_1_0.0
-   * @return The target property.
+   * @return The target property
    */
   Dali::Property::Index GetTargetProperty();
 
   /**
-   * @brief Set the remove action. Constraint::Bake will "bake" a value when fully-applied.
+   * @brief Sets the remove action. Constraint::BAKE will "bake" a value when fully-applied.
    *
-   * In case of Constraint::Discard, the constrained value will be discarded, when the constraint is removed.
-   * The default value is Constraint::Bake.
+   * In case of Constraint::DISCARD, the constrained value will be discarded, when the constraint is removed.
+   * The default value is Constraint::BAKE.
    * @SINCE_1_0.0
-   * @param[in] action The remove-action.
+   * @param[in] action The remove-action
    */
-  void SetRemoveAction( RemoveAction action );
+  void SetRemoveAction(RemoveAction action);
 
   /**
-   * @brief Retrieve the remove action that will happen when the constraint is removed.
+   * @brief Retrieves the remove action that will happen when the constraint is removed.
    *
    * @SINCE_1_0.0
-   * @return The remove-action.
+   * @return The remove-action
    */
   RemoveAction GetRemoveAction() const;
 
   /**
-   * @brief Set a tag for the constraint so it can be identified later
+   * @brief Sets a tag for the constraint so it can be identified later.
    *
    * @SINCE_1_0.0
    * @param[in] tag An integer to identify the constraint
    */
-  void SetTag( const unsigned int tag );
+  void SetTag(const uint32_t tag);
 
   /**
-   * @brief Get the tag
+   * @brief Gets the tag.
    *
    * @SINCE_1_0.0
    * @return The tag
    */
-  unsigned int GetTag() const;
+  uint32_t GetTag() const;
 
 public: // Not intended for use by Application developers
-
   /// @cond internal
   /**
-   * @brief This constructor is used by Constraint::New() methods
+   * @brief This constructor is used by Constraint::New() methods.
    * @SINCE_1_0.0
-   * @param [in] constraint A pointer to a newly allocated Dali resource
+   * @param[in] constraint A pointer to a newly allocated Dali resource
    */
-  explicit DALI_INTERNAL Constraint( Internal::ConstraintBase* constraint );
+  explicit DALI_INTERNAL Constraint(Internal::ConstraintBase* constraint);
   /// @endcond
 
 private: // Not intended for use by Application developers
-
   /// @cond internal
   /**
-   * @brief Construct a new constraint which targets a property.
+   * @brief Constructs a new constraint which targets a property.
    *
    * @SINCE_1_0.0
-   * @param[in]  handle       The handle to the property-owning object.
-   * @param[in]  targetIndex  The index of the property to constrain.
-   * @param[in]  targetType   Type The type of the constrained property.
-   * @param[in]  function     The constraint function.
-   * @return The new constraint.
+   * @param[in]  handle       The handle to the property-owning object
+   * @param[in]  targetIndex  The index of the property to constrain
+   * @param[in]  targetType   Type The type of the constrained property
+   * @param[in]  function     The constraint function
+   * @return The new constraint
    */
-  static Constraint New( Handle handle, Property::Index targetIndex, Property::Type targetType, CallbackBase* function );
+  static Constraint New(Handle handle, Property::Index targetIndex, Property::Type targetType, CallbackBase* function);
   /// @endcond
 };
 
@@ -546,4 +550,4 @@ private: // Not intended for use by Application developers
  */
 } // namespace Dali
 
-#endif // __DALI_CONSTRAINT_H__
+#endif // DALI_CONSTRAINT_H