Remove current and future memory leaks with messages by forcing the use of OwnerPoint...
[platform/core/uifw/dali-core.git] / dali / internal / update / common / property-owner.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/update/common/property-owner.h>
20
21 // EXTERNAL INCLUDES
22 #include <algorithm>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/common/dali-common.h>
26 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
27
28 namespace Dali
29 {
30
31 namespace Internal
32 {
33
34 namespace SceneGraph
35 {
36
37 PropertyOwner* PropertyOwner::New()
38 {
39   return new PropertyOwner();
40 }
41
42 PropertyOwner::~PropertyOwner()
43 {
44   Destroy();
45 }
46
47 void PropertyOwner::AddObserver(Observer& observer)
48 {
49   //Check for duplicates in debug builds
50   DALI_ASSERT_DEBUG( mObservers.End() == std::find( mObservers.Begin(), mObservers.End(), &observer ) );
51
52   mObservers.PushBack( &observer );
53 }
54
55 void PropertyOwner::RemoveObserver(Observer& observer)
56 {
57   // Find the observer...
58   const ConstObserverIter endIter =  mObservers.End();
59   for( ObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
60   {
61     if( (*iter) == &observer)
62     {
63       // erase it
64       mObservers.Erase(iter);
65       break;
66     }
67   }
68 }
69
70 bool PropertyOwner::IsObserved()
71 {
72   return mObservers.Count() != 0u;
73 }
74
75 void PropertyOwner::Destroy()
76 {
77   // Notification for observers
78   const ConstObserverIter endIter = mObservers.End();
79   for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
80   {
81     (*iter)->PropertyOwnerDestroyed(*this);
82   }
83
84   mObservers.Clear();
85
86   // Remove all constraints when disconnected from scene-graph
87   mConstraints.Clear();
88 }
89
90 void PropertyOwner::ConnectToSceneGraph()
91 {
92   // Notification for observers
93   const ConstObserverIter endIter = mObservers.End();
94   for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
95   {
96     (*iter)->PropertyOwnerConnected( *this );
97   }
98 }
99
100 void PropertyOwner::DisconnectFromSceneGraph( BufferIndex updateBufferIndex )
101 {
102   // Notification for observers
103   const ConstObserverIter endIter = mObservers.End();
104   for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
105   {
106     (*iter)->PropertyOwnerDisconnected( updateBufferIndex, *this );
107   }
108
109   // Remove all constraints when disconnected from scene-graph
110   mConstraints.Clear();
111 }
112
113 void PropertyOwner::InstallCustomProperty( OwnerPointer<PropertyBase>& property )
114 {
115   mCustomProperties.PushBack( property.Release() );
116 }
117
118 void PropertyOwner::ResetToBaseValues( BufferIndex updateBufferIndex )
119 {
120   // Reset custom properties
121   const OwnedPropertyIter endIter = mCustomProperties.End();
122   for ( OwnedPropertyIter iter = mCustomProperties.Begin(); endIter != iter; ++iter )
123   {
124     (*iter)->ResetToBaseValue( updateBufferIndex );
125   }
126
127   // Notification for derived classes, to reset default properties
128   ResetDefaultProperties( updateBufferIndex );
129 }
130
131 ConstraintOwnerContainer& PropertyOwner::GetConstraints()
132 {
133   return mConstraints;
134 }
135
136 void PropertyOwner::ApplyConstraint( OwnerPointer<ConstraintBase>& constraint )
137 {
138   constraint->OnConnect();
139   mConstraints.PushBack( constraint.Release() );
140 }
141
142 void PropertyOwner::RemoveConstraint( ConstraintBase* constraint )
143 {
144   const ConstraintIter constraintEndIter = mConstraints.End();
145   for( ConstraintIter iter = mConstraints.Begin(); constraintEndIter != iter; ++iter )
146   {
147     if ( *iter == constraint )
148     {
149       mConstraints.Erase( iter );
150       return; // We're finished
151     }
152   }
153
154   //it may be that the constraint has already been removed e.g. from disconnection from scene graph, so nothing needs to be done
155 }
156
157 PropertyOwner::PropertyOwner()
158 {
159 }
160
161 void PropertyOwner::AddUniformMapping( OwnerPointer< UniformPropertyMapping >& map )
162 {
163   mUniformMaps.Add( map.Release() );
164 }
165
166 void PropertyOwner::RemoveUniformMapping( const std::string& uniformName )
167 {
168   mUniformMaps.Remove( uniformName );
169 }
170
171 const UniformMap& PropertyOwner::GetUniformMap() const
172 {
173   return mUniformMaps;
174 }
175
176 void PropertyOwner::AddUniformMapObserver( UniformMap::Observer& observer )
177 {
178   mUniformMaps.AddObserver( observer );
179 }
180
181 void PropertyOwner::RemoveUniformMapObserver( UniformMap::Observer& observer )
182 {
183   mUniformMaps.RemoveObserver( observer );
184 }
185
186
187
188 } // namespace SceneGraph
189
190 } // namespace Internal
191
192 } // namespace Dali