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.
22 #include <unique_ptr.h>
23 #include <FBaseColQueue.h>
24 #include <FBaseResult.h>
25 #include <FBaseSysLog.h>
27 namespace Tizen { namespace Base { namespace Collection
31 * @class _QueueEnumerator
32 * @brief This is an implementation of IEnumerator for Queue.
34 class _QueueEnumerator
39 _QueueEnumerator(const Queue& queue, int modCount);
40 virtual ~_QueueEnumerator(void);
42 virtual Object* GetCurrent(void) const;
43 virtual result MoveNext(void);
44 virtual result Reset(void);
52 _QueueEnumerator::_QueueEnumerator(const Queue& queue, int modCount)
54 , __modCount(modCount)
59 _QueueEnumerator::~_QueueEnumerator(void)
64 _QueueEnumerator::GetCurrent(void) const
66 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));
67 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));
69 SetLastResult(E_SUCCESS);
70 return __queue.__pObjArray[__position % __queue.__capacity];
74 _QueueEnumerator::MoveNext(void)
76 SysTryReturnResult(NID_BASE_COL, __modCount == __queue.__modCount, E_INVALID_OPERATION, "The source collection was modified after the creation of this enumerator.");
78 if ((__position + 1) >= __queue.__head)
80 return E_OUT_OF_RANGE;
85 __position = __queue.__tail;
96 _QueueEnumerator::Reset(void)
98 SysTryReturnResult(NID_BASE_COL, __modCount == __queue.__modCount, E_INVALID_OPERATION, "The source collection was modified after the creation of this enumerator.");
118 delete[] __pObjArray;
122 Queue::Construct(int capacity)
124 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);
126 result r = E_SUCCESS;
130 __pObjArray = new (std::nothrow) Object*[capacity];
131 SysTryCatch(NID_BASE_COL, __pObjArray != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
133 __capacity = capacity;
142 Queue::Construct(const ICollection& collection)
144 result r = E_SUCCESS;
145 int count = collection.GetCount();
146 r = Construct(count);
147 SysTryReturnResult(NID_BASE_COL, r == E_SUCCESS, r, "Propagating.");
151 std::unique_ptr< IEnumerator > pEnum(collection.GetEnumeratorN());
152 SysTryCatch(NID_BASE_COL, pEnum != null, r = GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
154 while ((r = pEnum->MoveNext()) != E_OUT_OF_RANGE)
156 SysTryCatch(NID_BASE_COL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
158 Object* pTemp = pEnum->GetCurrent();
159 SysTryCatch(NID_BASE_COL, pTemp != null, r = GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
161 __pObjArray[__head % __capacity] = pTemp;
169 delete[] __pObjArray;
178 SysTryReturn(NID_BASE_COL, __head > __tail, null, E_UNDERFLOW, "[%s] Dequeue operation failed.", GetErrorMessage(E_UNDERFLOW));
182 SetLastResult(E_SUCCESS);
183 return __pObjArray[(__tail++) % __capacity];
187 Queue::Enqueue(Object* pObj)
189 SysTryReturnResult(NID_BASE_COL, pObj != null, E_INVALID_ARG, "Invalid argument used. The pObj is null");
191 if (__pObjArray == null)
193 __pObjArray = new (std::nothrow) Object*[DEFAULT_CAPACITY];
194 SysTryReturnResult(NID_BASE_COL, __pObjArray != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
196 __capacity = DEFAULT_CAPACITY;
198 else if ((__head - __tail) >= __capacity)
200 Object** pNewArray = new (std::nothrow) Object*[__capacity + DEFAULT_CAPACITY];
201 SysTryReturnResult(NID_BASE_COL, pNewArray != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
202 for (int i = 0, j = __tail; i < __capacity; i++, j++)
204 pNewArray[i] = __pObjArray[j % __capacity];
207 delete[] __pObjArray;
209 __pObjArray = pNewArray;
212 __capacity += DEFAULT_CAPACITY;
217 __pObjArray[__head % __capacity] = pObj;
224 Queue::GetEnumeratorN(void) const
226 std::unique_ptr< _QueueEnumerator > pEnum(new (std::nothrow) _QueueEnumerator(*this, __modCount));
227 SysTryReturn(NID_BASE_COL, pEnum != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
229 SetLastResult(E_SUCCESS);
230 return pEnum.release();
234 Queue::Peek(void) const
236 SysTryReturn(NID_BASE_COL, __head > __tail, null, E_UNDERFLOW, "[%s] Peek operation failed.", GetErrorMessage(E_UNDERFLOW));
238 SetLastResult(E_SUCCESS);
239 return __pObjArray[__tail % __capacity];
243 Queue::RemoveAll(bool deallocate)
246 int count = GetCount();
247 for (int i = 0; i < count; i++)
251 delete __pObjArray[(__tail + i) % __capacity];
254 __pObjArray[(__tail + i) % __capacity] = null;
262 Queue::GetCount(void) const
264 return(__head - __tail);
268 Queue::Contains(const Object& obj) const
270 int count = GetCount();
271 for (int i = 0; i < count; i++)
273 if (__pObjArray[(__tail + i) % __capacity]->Equals(obj))
283 Queue::ContainsAll(const ICollection& collection) const
285 result r = E_SUCCESS;
288 std::unique_ptr< IEnumerator > pEnum(collection.GetEnumeratorN());
289 SysTryReturn(NID_BASE_COL, pEnum != null, false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
291 while ((r = pEnum->MoveNext()) != E_OUT_OF_RANGE)
293 SysTryReturn(NID_BASE_COL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
295 Object* pItem = pEnum->GetCurrent();
296 SysTryReturn(NID_BASE_COL, pItem != null, false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
298 if (!Contains(*pItem))
308 Queue::Equals(const Object& obj) const
310 const Queue* pOther = dynamic_cast< const Queue* >(&obj);
315 else if (pOther == this)
319 else if (GetCount() != pOther->GetCount())
325 int count = GetCount();
326 for (int i = 0; i < count; i++)
328 if (!(__pObjArray[(__tail + i) % __capacity]->Equals(*(pOther->__pObjArray[(pOther->__tail + i) % pOther->__capacity]))))
339 Queue::GetHashCode(void) const
342 int count = GetCount();
343 for (int i = 0; i < count; i++)
345 if (__pObjArray[(__tail + i) % __capacity] != null)
347 hash += __pObjArray[(__tail + i) % __capacity]->GetHashCode();
352 }}} // Tizen::Base::Collection