Remove duplicated Erase iteration code by introducing EraseObject method in OwnerCont... 76/128076/7
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Thu, 4 May 2017 16:49:06 +0000 (17:49 +0100)
committerKimmo Hoikka <kimmo.hoikka@samsung.com>
Tue, 9 May 2017 15:58:49 +0000 (16:58 +0100)
Change-Id: I3317c7e1347ee0f07b6648202bf3a640498134a0

automated-tests/src/dali/utc-Dali-Handle.cpp
dali/devel-api/common/owner-container.h
dali/internal/render/common/render-manager.cpp
dali/internal/update/manager/update-manager.cpp

index f66177b..874b936 100644 (file)
@@ -896,9 +896,36 @@ int UtcDaliHandleWeightNew(void)
 {
   TestApplication application;
 
-  Handle handle = WeightObject::New();;
+  Handle handle = WeightObject::New();
   DALI_TEST_CHECK( handle.GetProperty<float>(WeightObject::WEIGHT) == 0.0f );
 
+  // process the message so scene object is added to update manager
+  application.SendNotification();
+  application.Render(0);
+
+  // no message to release scene object in this scenario
+
+  END_TEST;
+}
+
+int UtcDaliHandleWeightNew2(void)
+{
+  TestApplication application;
+
+  // scope for the weight object
+  {
+    Handle handle = WeightObject::New();
+    DALI_TEST_CHECK( handle.GetProperty<float>(WeightObject::WEIGHT) == 0.0f );
+
+    // process the message so scene object is added to update manager
+    application.SendNotification();
+    application.Render(0);
+  }
+  // handle out of scope so object gets destroyed
+  // process the message so update manager destroys the scene object
+  application.SendNotification();
+  application.Render(0);
+
   END_TEST;
 }
 
index 3ac0df2..f35b278 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_OWNER_CONTAINER_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
@@ -83,6 +83,26 @@ public:
   }
 
   /**
+   * Erase an object from OwnerContainer
+   * @param object to remove
+   */
+  inline void EraseObject( T object )
+  {
+    DALI_ASSERT_DEBUG( object && "NULL object not allowed" );
+
+    Iterator iter = Vector< T >::Begin();
+    const ConstIterator endIter = Vector< T >::End();
+    for ( ; iter != endIter; ++iter )
+    {
+      if ( *iter == object )
+      {
+        Erase( iter );
+        return;
+      }
+    }
+  }
+
+  /**
    * Release the ownership of an object, without deleting it.
    * @param[in] position A dereferencable iterator to an element in mContainer.
    * @post iterators are invalidated by this method.
index aabfbfd..ce2bb78 100644 (file)
@@ -106,15 +106,7 @@ struct RenderManager::Impl
 
   void RemoveRenderTracker( Render::RenderTracker* renderTracker )
   {
-    DALI_ASSERT_DEBUG( renderTracker != NULL );
-    for(RenderTrackerIter iter = mRenderTrackers.Begin(), end = mRenderTrackers.End(); iter != end; ++iter)
-    {
-      if( *iter == renderTracker )
-      {
-        mRenderTrackers.Erase( iter );
-        break;
-      }
-    }
+    mRenderTrackers.EraseObject( renderTracker );
   }
 
   void UpdateTrackers()
@@ -252,19 +244,7 @@ void RenderManager::AddRenderer( Render::Renderer* renderer )
 
 void RenderManager::RemoveRenderer( Render::Renderer* renderer )
 {
-  DALI_ASSERT_DEBUG( NULL != renderer );
-
-  RendererOwnerContainer& renderers = mImpl->rendererContainer;
-
-  // Find the renderer
-  for ( RendererOwnerIter iter = renderers.Begin(); iter != renderers.End(); ++iter )
-  {
-    if ( *iter == renderer )
-    {
-      renderers.Erase( iter ); // Renderer found; now destroy it
-      break;
-    }
-  }
+  mImpl->rendererContainer.EraseObject( renderer );
 }
 
 void RenderManager::AddSampler( Render::Sampler* sampler )
@@ -274,19 +254,7 @@ void RenderManager::AddSampler( Render::Sampler* sampler )
 
 void RenderManager::RemoveSampler( Render::Sampler* sampler )
 {
-  DALI_ASSERT_DEBUG( NULL != sampler );
-
-  SamplerOwnerContainer& samplers = mImpl->samplerContainer;
-
-  // Find the sampler
-  for ( SamplerOwnerIter iter = samplers.Begin(); iter != samplers.End(); ++iter )
-  {
-    if ( *iter == sampler )
-    {
-      samplers.Erase( iter ); // Sampler found; now destroy it
-      break;
-    }
-  }
+  mImpl->samplerContainer.EraseObject( sampler );
 }
 
 void RenderManager::AddTexture( Render::Texture* texture )
@@ -372,19 +340,7 @@ void RenderManager::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer )
 
 void RenderManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
 {
-  DALI_ASSERT_DEBUG( NULL != propertyBuffer );
-
-  PropertyBufferOwnerContainer& propertyBuffers = mImpl->propertyBufferContainer;
-
-  // Find the sampler
-  for ( PropertyBufferOwnerIter iter = propertyBuffers.Begin(); iter != propertyBuffers.End(); ++iter )
-  {
-    if ( *iter == propertyBuffer )
-    {
-      propertyBuffers.Erase( iter ); // Property buffer found; now destroy it
-      break;
-    }
-  }
+  mImpl->propertyBufferContainer.EraseObject( propertyBuffer );
 }
 
 void RenderManager::SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format )
@@ -409,19 +365,7 @@ void RenderManager::AddGeometry( Render::Geometry* geometry )
 
 void RenderManager::RemoveGeometry( Render::Geometry* geometry )
 {
-  DALI_ASSERT_DEBUG( NULL != geometry );
-
-  GeometryOwnerContainer& geometries = mImpl->geometryContainer;
-
-  // Find the geometry
-  for ( GeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter )
-  {
-    if ( *iter == geometry )
-    {
-      geometries.Erase( iter ); // Geometry found; now destroy it
-      break;
-    }
-  }
+  mImpl->geometryContainer.EraseObject( geometry );
 }
 
 void RenderManager::AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
index 0fcddea..e90123e 100644 (file)
@@ -126,6 +126,8 @@ inline void ResetToBaseValues( OwnerContainer<T*>& container, BufferIndex update
 template < class T >
 inline void EraseUsingDiscardQueue( OwnerContainer<T*>& container, T* object, DiscardQueue& discardQueue, BufferIndex updateBufferIndex )
 {
+  DALI_ASSERT_DEBUG( object && "NULL object not allowed" );
+
   typename OwnerContainer<T*>::Iterator iter = container.Begin();
   const typename OwnerContainer<T*>::ConstIterator endIter = container.End();
   for ( ; iter != endIter; ++iter )
@@ -434,23 +436,7 @@ void UpdateManager::AddObject( PropertyOwner* object )
 
 void UpdateManager::RemoveObject( PropertyOwner* object )
 {
-  DALI_ASSERT_DEBUG( NULL != object );
-
-  OwnerContainer< PropertyOwner* >& customObjects = mImpl->customObjects;
-
-  // Find the object and destroy it
-  for ( OwnerContainer< PropertyOwner* >::Iterator iter = customObjects.Begin(); iter != customObjects.End(); ++iter )
-  {
-    PropertyOwner* current = *iter;
-    if ( current == object )
-    {
-      customObjects.Erase( iter );
-      return;
-    }
-  }
-
-  // Should not reach here
-  DALI_ASSERT_DEBUG(false);
+  mImpl->customObjects.EraseObject( object );
 }
 
 void UpdateManager::AddAnimation( Animation* animation )
@@ -505,18 +491,7 @@ void UpdateManager::AddPropertyNotification( PropertyNotification* propertyNotif
 
 void UpdateManager::RemovePropertyNotification( PropertyNotification* propertyNotification )
 {
-  PropertyNotificationContainer &propertyNotifications = mImpl->propertyNotifications;
-  PropertyNotificationIter iter = propertyNotifications.Begin();
-
-  while ( iter != propertyNotifications.End() )
-  {
-    if( *iter == propertyNotification )
-    {
-      propertyNotifications.Erase(iter);
-      break;
-    }
-    ++iter;
-  }
+  mImpl->propertyNotifications.EraseObject( propertyNotification );
 }
 
 void UpdateManager::PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode )
@@ -534,8 +509,6 @@ void UpdateManager::AddShader( Shader* shader )
 
 void UpdateManager::RemoveShader( Shader* shader )
 {
-  DALI_ASSERT_DEBUG(shader != NULL);
-
   // Find the shader and destroy it
   EraseUsingDiscardQueue( mImpl->shaders, shader, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() );
 }
@@ -583,12 +556,10 @@ void UpdateManager::AddRenderer( Renderer* renderer )
 
 void UpdateManager::RemoveRenderer( Renderer* renderer )
 {
-  DALI_ASSERT_DEBUG( renderer != NULL );
-
-  renderer->DisconnectFromSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() );
-
   // Find the renderer and destroy it
   EraseUsingDiscardQueue( mImpl->renderers, renderer, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() );
+  // Need to remove the render object as well
+  renderer->DisconnectFromSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() );
 }
 
 void UpdateManager::SetPanGestureProcessor( PanGesture* panGestureProcessor )
@@ -601,23 +572,13 @@ void UpdateManager::SetPanGestureProcessor( PanGesture* panGestureProcessor )
 void UpdateManager::AddTextureSet( TextureSet* textureSet )
 {
   DALI_ASSERT_DEBUG( NULL != textureSet );
+
   mImpl->textureSets.PushBack( textureSet );
 }
 
 void UpdateManager::RemoveTextureSet( TextureSet* textureSet )
 {
-  DALI_ASSERT_DEBUG( textureSet != NULL );
-
-  // Find the texture and destroy it
-  TextureSetOwner& textures = mImpl->textureSets;
-  for ( TextureSetIter iter = textures.Begin(), endIter = textures.End(); iter != endIter; ++iter )
-  {
-    if ( *iter == textureSet )
-    {
-      textures.Erase( iter );
-      return;
-    }
-  }
+  mImpl->textureSets.EraseObject( textureSet );
 }
 
 RenderTaskList* UpdateManager::GetRenderTaskList( bool systemLevel )