2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
8 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 * @file FBaseColQueue.cpp
19 * @brief This is the implementation for Queue class.
23 #include <unique_ptr.h>
24 #include <FBaseColQueue.h>
25 #include <FBaseResult.h>
26 #include <FBaseSysLog.h>
29 namespace Tizen { namespace Base { namespace Collection
33 * @class _QueueEnumerator
34 * @brief This is an implementation of IEnumerator for Queue.
36 class _QueueEnumerator
41 _QueueEnumerator(const Queue& queue, int modCount);
42 virtual ~_QueueEnumerator(void);
44 virtual Object* GetCurrent(void) const;
45 virtual result MoveNext(void);
46 virtual result Reset(void);
54 _QueueEnumerator::_QueueEnumerator(const Queue& queue, int modCount)
56 , __modCount(modCount)
61 _QueueEnumerator::~_QueueEnumerator(void)
66 _QueueEnumerator::GetCurrent(void) const
68 SysTryReturn(NID_BASE_COL, __modCount == __queue.__modCount, null, E_INVALID_OPERATION, "[%s] The source collection was modified after the creation of this enumerator.", GetErrorMessage(E_INVALID_OPERATION));
69 SysTryReturn(NID_BASE_COL, (__position >= __queue.__tail) && (__position < __queue.__head), null, E_INVALID_OPERATION, "[%s] Current position is before the first element or past the last element.", GetErrorMessage(E_INVALID_OPERATION));
71 SetLastResult(E_SUCCESS);
72 return __queue.__pObjArray[__position % __queue.__capacity];
76 _QueueEnumerator::MoveNext(void)
78 SysTryReturnResult(NID_BASE_COL, __modCount == __queue.__modCount, E_INVALID_OPERATION, "The source collection was modified after the creation of this enumerator.");
80 if ((__position + 1) >= __queue.__head)
82 return E_OUT_OF_RANGE;
87 __position = __queue.__tail;
98 _QueueEnumerator::Reset(void)
100 SysTryReturnResult(NID_BASE_COL, __modCount == __queue.__modCount, E_INVALID_OPERATION, "The source collection was modified after the creation of this enumerator.");
120 delete[] __pObjArray;
124 Queue::Construct(int capacity)
126 SysTryReturn(NID_BASE_COL, capacity >= 0, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument(s) is used. The capacity(%d) MUST be greater than or equal to 0.", GetErrorMessage(E_INVALID_ARG), capacity);
128 result r = E_SUCCESS;
132 __pObjArray = new (std::nothrow) Object*[capacity];
133 SysTryCatch(NID_BASE_COL, __pObjArray != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
135 __capacity = capacity;
144 Queue::Construct(const ICollection& collection)
146 result r = E_SUCCESS;
147 int count = collection.GetCount();
148 r = Construct(count);
149 SysTryReturnResult(NID_BASE_COL, r == E_SUCCESS, r, "Propagating.");
153 std::unique_ptr< IEnumerator > pEnum(collection.GetEnumeratorN());
154 SysTryCatch(NID_BASE_COL, pEnum != null, r = GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
156 while ((r = pEnum->MoveNext()) != E_OUT_OF_RANGE)
158 SysTryCatch(NID_BASE_COL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
160 Object* pTemp = pEnum->GetCurrent();
161 SysTryCatch(NID_BASE_COL, pTemp != null, r = GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
163 __pObjArray[__head % __capacity] = pTemp;
171 delete[] __pObjArray;
180 SysTryReturn(NID_BASE_COL, __head > __tail, null, E_UNDERFLOW, "[%s] Dequeue operation failed.", GetErrorMessage(E_UNDERFLOW));
184 SetLastResult(E_SUCCESS);
185 return __pObjArray[(__tail++) % __capacity];
189 Queue::Enqueue(Object* pObj)
191 SysTryReturnResult(NID_BASE_COL, pObj != null, E_INVALID_ARG, "Invalid argument used. The pObj is null");
193 if (__pObjArray == null)
195 __pObjArray = new (std::nothrow) Object*[DEFAULT_CAPACITY];
196 SysTryReturnResult(NID_BASE_COL, __pObjArray != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
198 __capacity = DEFAULT_CAPACITY;
200 else if ((__head - __tail) >= __capacity)
202 Object** pNewArray = new (std::nothrow) Object*[__capacity + DEFAULT_CAPACITY];
203 SysTryReturnResult(NID_BASE_COL, pNewArray != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
204 for (int i = 0, j = __tail; i < __capacity; i++, j++)
206 pNewArray[i] = __pObjArray[j % __capacity];
209 delete[] __pObjArray;
211 __pObjArray = pNewArray;
214 __capacity += DEFAULT_CAPACITY;
219 __pObjArray[__head % __capacity] = pObj;
226 Queue::GetEnumeratorN(void) const
228 std::unique_ptr< _QueueEnumerator > pEnum(new (std::nothrow) _QueueEnumerator(*this, __modCount));
229 SysTryReturn(NID_BASE_COL, pEnum != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
231 SetLastResult(E_SUCCESS);
232 return pEnum.release();
236 Queue::Peek(void) const
238 SysTryReturn(NID_BASE_COL, __head > __tail, null, E_UNDERFLOW, "[%s] Peek operation failed.", GetErrorMessage(E_UNDERFLOW));
240 SetLastResult(E_SUCCESS);
241 return __pObjArray[__tail % __capacity];
245 Queue::RemoveAll(bool deallocate)
248 int count = GetCount();
249 for (int i = 0; i < count; i++)
253 delete __pObjArray[(__tail + i) % __capacity];
256 __pObjArray[(__tail + i) % __capacity] = null;
264 Queue::GetCount(void) const
266 return(__head - __tail);
270 Queue::Contains(const Object& obj) const
272 int count = GetCount();
273 for (int i = 0; i < count; i++)
275 if (__pObjArray[(__tail + i) % __capacity]->Equals(obj))
285 Queue::ContainsAll(const ICollection& collection) const
287 result r = E_SUCCESS;
290 std::unique_ptr< IEnumerator > pEnum(collection.GetEnumeratorN());
291 SysTryReturn(NID_BASE_COL, pEnum != null, false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
293 while ((r = pEnum->MoveNext()) != E_OUT_OF_RANGE)
295 SysTryReturn(NID_BASE_COL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
297 Object* pItem = pEnum->GetCurrent();
298 SysTryReturn(NID_BASE_COL, pItem != null, false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
300 if (!Contains(*pItem))
310 Queue::Equals(const Object& obj) const
312 const Queue* pOther = dynamic_cast< const Queue* >(&obj);
317 else if (pOther == this)
321 else if (GetCount() != pOther->GetCount())
327 int count = GetCount();
328 for (int i = 0; i < count; i++)
330 if (!(__pObjArray[(__tail + i) % __capacity]->Equals(*(pOther->__pObjArray[(pOther->__tail + i) % pOther->__capacity]))))
341 Queue::GetHashCode(void) const
344 int count = GetCount();
345 for (int i = 0; i < count; i++)
347 if (__pObjArray[(__tail + i) % __capacity] != null)
349 hash += __pObjArray[(__tail + i) % __capacity]->GetHashCode();
354 }}} // Tizen::Base::Collection