Merge "Check whether the scene-graph RenderTask object is valid" into devel/master
[platform/core/uifw/dali-core.git] / dali / devel-api / common / owner-container.h
index f35b278..b010f41 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_OWNER_CONTAINER_H__
-#define __DALI_OWNER_CONTAINER_H__
+#ifndef DALI_OWNER_CONTAINER_H
+#define DALI_OWNER_CONTAINER_H
 
 /*
- * Copyright (c) 2017 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.
@@ -24,7 +24,6 @@
 
 namespace Dali
 {
-
 /**
  * OwnerContainer is a vector which own heap-allocated objects.
  * Unlike vector this will call delete on the stored pointers during destruction.
@@ -38,20 +37,18 @@ namespace Dali
  *
  * @endcode
  */
-template< class T >
-class OwnerContainer : public Dali::Vector< T >
+template<class T>
+class OwnerContainer : public Dali::Vector<T>
 {
 public:
-
-  typedef typename Dali::Vector< T >::SizeType SizeType;
-  typedef typename Vector< T >::Iterator Iterator;
-  typedef typename Vector< T >::ConstIterator ConstIterator;
+  using SizeType      = typename Dali::Vector<T>::SizeType;
+  using Iterator      = typename Vector<T>::Iterator;
+  using ConstIterator = typename Vector<T>::ConstIterator;
 
   /**
    * Create a pointer-container.
    */
-  OwnerContainer()
-  { }
+  OwnerContainer() = default;
 
   /**
    * Non-virtual destructor; OwnerContainer<T> is not suitable as base class.
@@ -62,6 +59,12 @@ public:
     VectorBase::Release();
   }
 
+  // Not copyable or movable
+  OwnerContainer(const OwnerContainer&) = delete;            ///< Deleted copy constructor
+  OwnerContainer(OwnerContainer&&)      = delete;            ///< Deleted move constructor
+  OwnerContainer& operator=(const OwnerContainer&) = delete; ///< Deleted copy assignment operator
+  OwnerContainer& operator=(OwnerContainer&&) = delete;      ///< Deleted move assignment operator
+
   /**
    * Test whether the container is empty.
    * @return True if the container is empty
@@ -76,27 +79,68 @@ public:
    * @param[in] position A dereferencable iterator to an element in mContainer.
    * @return iterator pointing to next element
    */
-  Iterator Erase( Iterator position )
+  Iterator Erase(Iterator position)
   {
-    Delete (*position);
-    return Vector< T >::Erase( position );
+    Delete(*position);
+    return Vector<T>::Erase(position);
+  }
+
+  /**
+   * @brief Erases all elements that satisfy the predicate from the OwnerContainer.
+   *
+   * @param[in] predicate The predicate
+   */
+  template<class Predicate>
+  void EraseIf(Predicate predicate)
+  {
+    auto begin = Vector<T>::Begin();
+    auto end   = Vector<T>::End();
+
+    auto function = [predicate](auto& obj) {
+      if(predicate(obj))
+      {
+        delete obj;
+        return true;
+      }
+      else
+      {
+        return false;
+      }
+    };
+
+    Vector<T>::Erase(std::remove_if(begin, end, function), end);
+  }
+
+  /**
+   * Erases a range of elements.(delete from heap).
+   */
+  Iterator Erase(Iterator first, Iterator last)
+  {
+    auto itr = first;
+    while(itr < last)
+    {
+      Delete(*itr);
+      ++itr;
+    }
+
+    return Vector<T>::Erase(first, last);
   }
 
   /**
    * Erase an object from OwnerContainer
    * @param object to remove
    */
-  inline void EraseObject( T object )
+  inline void EraseObject(T object)
   {
-    DALI_ASSERT_DEBUG( object && "NULL object not allowed" );
+    DALI_ASSERT_DEBUG(object && "NULL object not allowed");
 
-    Iterator iter = Vector< T >::Begin();
-    const ConstIterator endIter = Vector< T >::End();
-    for ( ; iter != endIter; ++iter )
+    Iterator            iter    = Vector<T>::Begin();
+    const ConstIterator endIter = Vector<T>::End();
+    for(; iter != endIter; ++iter)
     {
-      if ( *iter == object )
+      if(*iter == object)
       {
-        Erase( iter );
+        Erase(iter);
         return;
       }
     }
@@ -108,10 +152,10 @@ public:
    * @post iterators are invalidated by this method.
    * @return pointer to the released item
    */
-  T Release( Iterator position )
+  T Release(Iterator position)
   {
     T pointer = *position;
-    Vector< T >::Erase( position );
+    Vector<T>::Erase(position);
     return pointer;
   }
 
@@ -120,30 +164,30 @@ public:
    */
   void Clear()
   {
-    ConstIterator end = Vector< T >::End();
-    for( Iterator iter = Vector< T >::Begin(); iter != end; ++iter )
+    ConstIterator end = Vector<T>::End();
+    for(Iterator iter = Vector<T>::Begin(); iter != end; ++iter)
     {
-      Delete (*iter);
+      Delete(*iter);
     }
-    Vector< T >::Clear();
+    Vector<T>::Clear();
   }
 
   /**
    * Resizes the container to hold specific amount of elements
    * @param size to resize to
    */
-  void Resize( SizeType size )
+  void Resize(SizeType size)
   {
-    if( size < VectorBase::Count() )
+    if(size < VectorBase::Count())
     {
       // OwnerContainer owns these heap-allocated objects
-      ConstIterator end = Vector< T >::End();
-      for( Iterator iter = Vector< T >::Begin() + size; iter != end; ++iter )
+      ConstIterator end = Vector<T>::End();
+      for(Iterator iter = Vector<T>::Begin() + size; iter != end; ++iter)
       {
-        Delete (*iter);
+        Delete(*iter);
       }
     }
-    Vector< T >::Resize( size );
+    Vector<T>::Resize(size);
   }
 
   /**
@@ -151,54 +195,46 @@ public:
    * without deleting them. It will keep the original items here as well.
    * @param[in] source where to move elements from to this OwnerContainer
    */
-  void MoveFrom( OwnerContainer& source )
+  void MoveFrom(OwnerContainer& source)
   {
-    typename Vector< T >::SizeType sourceCount = source.Count();
+    typename Vector<T>::SizeType sourceCount = source.Count();
     // if source is empty, nothing to move
-    if( sourceCount > 0u )
+    if(sourceCount > 0u)
     {
       // Optimisation for the case that this is empty
-      if( IsEmpty() )
+      if(IsEmpty())
       {
-        VectorBase::Swap( source );
+        VectorBase::Swap(source);
       }
       else
       {
         // make space for new items
-        Vector< T >::Reserve( VectorBase::Count() + sourceCount );
-        Iterator iter = source.Begin();
-        ConstIterator end = source.End();
-        for( ; iter != end; ++iter )
+        Vector<T>::Reserve(VectorBase::Count() + sourceCount);
+        Iterator      iter = source.Begin();
+        ConstIterator end  = source.End();
+        for(; iter != end; ++iter)
         {
           T pointer = *iter;
-          Vector< T >::PushBack( pointer );
+          Vector<T>::PushBack(pointer);
         }
         // cannot call Clear on OwnerContainer as that deletes the elements
-        source.Vector< T >::Clear();
+        source.Vector<T>::Clear();
       }
     }
   }
 
 private:
-
-  // Undefined copy constructor.
-  OwnerContainer( const OwnerContainer& );
-  // Undefined assignment operator.
-  OwnerContainer& operator=( const OwnerContainer& );
-
   /**
    * @brief delete the contents of the pointer
    * Function provided to allow classes to provide a custom destructor through template specialisation
    * @param pointer to the object
    */
-  void Delete( T pointer )
+  void Delete(T pointer)
   {
     delete pointer;
   }
-
-
 };
 
 } // namespace Dali
 
-#endif //__DALI_OWNER_CONTAINER_H__
+#endif //DALI_OWNER_CONTAINER_H