1 #ifndef DALI_OWNER_CONTAINER_H
2 #define DALI_OWNER_CONTAINER_H
5 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/public-api/common/dali-vector.h>
28 * OwnerContainer is a vector which own heap-allocated objects.
29 * Unlike vector this will call delete on the stored pointers during destruction.
30 * For example, you can define a vector of heap-allocated Node objects:
32 * typedef OwnerContainer< Node* > NodeContainer;
34 * NodeContainer container;
35 * container.PushBack( new Node() );
36 * // container is now responsible for calling delete on Node
41 class OwnerContainer : public Dali::Vector<T>
44 using SizeType = typename Dali::Vector<T>::SizeType;
45 using Iterator = typename Vector<T>::Iterator;
46 using ConstIterator = typename Vector<T>::ConstIterator;
49 * Create a pointer-container.
51 OwnerContainer() = default;
54 * Non-virtual destructor; OwnerContainer<T> is not suitable as base class.
59 VectorBase::Release();
62 // Not copyable or movable
63 OwnerContainer(const OwnerContainer&) = delete; ///< Deleted copy constructor
64 OwnerContainer(OwnerContainer&&) = delete; ///< Deleted move constructor
65 OwnerContainer& operator=(const OwnerContainer&) = delete; ///< Deleted copy assignment operator
66 OwnerContainer& operator=(OwnerContainer&&) = delete; ///< Deleted move assignment operator
69 * Test whether the container is empty.
70 * @return True if the container is empty
74 return VectorBase::Count() == 0u;
78 * Erase an object from the container (delete from heap).
79 * @param[in] position A dereferencable iterator to an element in mContainer.
80 * @return iterator pointing to next element
82 Iterator Erase(Iterator position)
85 return Vector<T>::Erase(position);
89 * @brief Erases all elements that satisfy the predicate from the OwnerContainer.
91 * @param[in] predicate The predicate
93 template<class Predicate>
94 void EraseIf(Predicate predicate)
96 auto begin = Vector<T>::Begin();
97 auto end = Vector<T>::End();
99 auto function = [predicate](auto& obj) {
111 Vector<T>::Erase(std::remove_if(begin, end, function), end);
115 * Erases a range of elements.(delete from heap).
117 Iterator Erase(Iterator first, Iterator last)
126 return Vector<T>::Erase(first, last);
130 * Erase an object from OwnerContainer
131 * @param object to remove
133 inline void EraseObject(T object)
135 DALI_ASSERT_DEBUG(object && "NULL object not allowed");
137 Iterator iter = Vector<T>::Begin();
138 const ConstIterator endIter = Vector<T>::End();
139 for(; iter != endIter; ++iter)
150 * Release the ownership of an object, without deleting it.
151 * @param[in] position A dereferencable iterator to an element in mContainer.
152 * @post iterators are invalidated by this method.
153 * @return pointer to the released item
155 T Release(Iterator position)
157 T pointer = *position;
158 Vector<T>::Erase(position);
163 * Destroy all of the elements in the container.
167 ConstIterator end = Vector<T>::End();
168 for(Iterator iter = Vector<T>::Begin(); iter != end; ++iter)
176 * Resizes the container to hold specific amount of elements
177 * @param size to resize to
179 void Resize(SizeType size)
181 if(size < VectorBase::Count())
183 // OwnerContainer owns these heap-allocated objects
184 ConstIterator end = Vector<T>::End();
185 for(Iterator iter = Vector<T>::Begin() + size; iter != end; ++iter)
190 Vector<T>::Resize(size);
194 * Move the ownership of objects from another OwnerContainer to this one
195 * without deleting them. It will keep the original items here as well.
196 * @param[in] source where to move elements from to this OwnerContainer
198 void MoveFrom(OwnerContainer& source)
200 typename Vector<T>::SizeType sourceCount = source.Count();
201 // if source is empty, nothing to move
204 // Optimisation for the case that this is empty
207 VectorBase::Swap(source);
211 // make space for new items
212 Vector<T>::Reserve(VectorBase::Count() + sourceCount);
213 Iterator iter = source.Begin();
214 ConstIterator end = source.End();
215 for(; iter != end; ++iter)
218 Vector<T>::PushBack(pointer);
220 // cannot call Clear on OwnerContainer as that deletes the elements
221 source.Vector<T>::Clear();
228 * @brief delete the contents of the pointer
229 * Function provided to allow classes to provide a custom destructor through template specialisation
230 * @param pointer to the object
232 void Delete(T pointer)
240 #endif //DALI_OWNER_CONTAINER_H