2 // Open Service Platform
3 // Copyright (c) 2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FBaseColIteratorT.h
20 * @brief This is the header file for the %IteratorT class.
22 * This header file contains the declarations of the %IteratorT class.
25 #ifndef _FBASE_COL_ITERATOR_T_H_
26 #define _FBASE_COL_ITERATOR_T_H_
28 #include <algorithm> // std::swap (Before C++11)
30 #include <unique_ptr.h>
32 #include <FBaseColIList.h>
33 #include <FBaseColIBidirectionalEnumerator.h>
35 namespace Tizen { namespace Base { namespace Collection
39 * @brief This class provides an iterator that is used to convert IList to STL containers.
40 * StlConverter provides static methods to get this iterator from IList.
44 * @remarks This class satisfies only requirements of C++ standard library InputIterator concept due to limitations of Tizen Collection.
45 * So, this class can be used with C++ standard library algorithms which requires only InputIterator concept for their arguments.
48 template < typename T >
50 : public std::iterator< std::input_iterator_tag, T >
54 * Initializes this instance of %IteratorT class.
58 * @param[in] list A reference to the IList instance to convert
59 * @param[in] isPostEnd A boolean value to check the end
61 explicit IteratorT(const IList& list, bool isPostEnd = false)
63 , __isPostEnd(isPostEnd)
65 , __pEnum(__pList->GetBidirectionalEnumeratorN())
71 __currentObj = static_cast< T >(__pEnum->GetCurrent());
75 __index = __pList->GetCount();
76 __pEnum->MovePrevious();
81 * This is copy constructor of %IteratorT class.
85 * @param[in] rhs A reference to the %IteratorT instance
87 IteratorT(const IteratorT< T >& rhs)
88 : __pList(rhs.__pList)
89 , __isPostEnd(rhs.__isPostEnd)
90 , __index(rhs.__index)
91 , __pEnum(__pList->GetBidirectionalEnumeratorN())
92 , __currentObj(rhs.__currentObj)
96 for (int i = 0; i <= __index; ++i)
103 __pEnum->MovePrevious();
108 * This is assignment operator of %IteratorT class.
112 * @return A reference to the %IteratorT instance
113 * @param[in] rhs A reference to the %IteratorT instance on the right-hand side of the operator
115 IteratorT< T >& operator=(const IteratorT< T >& rhs)
117 IteratorT< T > tmp(rhs);
123 * This is the indirection operator for %IteratorT class.
127 * @return A T type reference
129 T& operator*(void) const
131 AppAssertf(!__isPostEnd && __index >= 0, "It is out of range.");
132 return const_cast< T& >(__currentObj);
136 * This is the structure dereference operator for %IteratorT class.
140 * @return A T type pointer equivalent to the pointer address
142 T* operator->(void) const
144 return &(operator*());
148 * Moves to the next element of the collection.
152 * @return A reference to the %IteratorT type instance
153 * @exception E_SUCCESS The method is successful.
154 * @exception E_OUT_OF_RANGE The iterator is outside the bounds of the list.
155 * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified operation
156 * the collection is modified after the enumerator is created.
157 * @remarks The specific error code can be accessed using GetLastResult() method.
159 IteratorT< T >& operator++(void)
161 const int PRE_BEGIN_IDX = -1;
162 TryCatchResult(__index >= PRE_BEGIN_IDX, , E_OUT_OF_RANGE, "[%s] It is out of range.", GetErrorMessage(E_OUT_OF_RANGE));
164 if (__index != PRE_BEGIN_IDX)
166 result r = __pEnum->MoveNext();
167 TryCatchResult(r == E_SUCCESS, __isPostEnd = true; __currentObj = null, r, "[%s] It already reached the end.", GetErrorMessage(r));
170 __currentObj = static_cast< T >(__pEnum->GetCurrent());
178 * Moves to the next element of the collection and returns the previous state.
182 * @return An IteratorT instance
183 * @exception E_SUCCESS The method is successful.
184 * @exception E_OUT_OF_RANGE The iterator is outside the bounds of the list.
185 * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified operation or
186 * the collection is modified after the enumerator is created.
187 * @remarks It takes O(n) time to get current Enumerate point to return. So use this operator as little as possible.
188 * @remarks The specific error code can be accessed using GetLastResult() method.
190 IteratorT< T > operator++(int)
192 IteratorT< T > tempIter = *this;
198 * Moves to the previous element of the collection.
202 * @return A reference to the %IteratorT type instance
203 * @exception E_SUCCESS The method is successful.
204 * @exception E_OUT_OF_RANGE The iterator is outside the bounds of the list.
205 * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified operation or
206 * the collection is modified after the enumerator is created.
207 * @remarks The specific error code can be accessed using GetLastResult() method.
209 IteratorT< T >& operator--(void)
211 TryCatchResult(__index <= __pList->GetCount(), , E_OUT_OF_RANGE, "[%s] It is out of range.", GetErrorMessage(E_OUT_OF_RANGE));
215 result r = __pEnum->MovePrevious();
216 TryCatchResult(r == E_SUCCESS, __currentObj = null, r, "[%s] It already reached the front.", GetErrorMessage(r));
223 __currentObj = static_cast< T >(__pEnum->GetCurrent());
231 * Moves to the previous element of the collection and returns the previous state.
235 * @return An IteratorT instance
236 * @exception E_SUCCESS The method is successful.
237 * @exception E_OUT_OF_RANGE The iterator is outside the bounds of the list.
238 * @exception E_INVALID_OPERATION The current state of the instance prohibits the execution of the specified operation or
239 * the collection is modified after the enumerator is created.
240 * @remarks It takes O(n) time to get current Enumerate point to return. So use this operator as little as possible.
241 * @remarks The specific error code can be accessed using GetLastResult() method.
243 IteratorT< T > operator--(int)
245 IteratorT< T > tempIter = *this;
251 * Checks the two %IteratorT instances for equality
255 * @return @c true if every member of the specified %IteratorT instance equals the calling instance's members, @n
257 * @param[in] rhs A reference to the %IteratorT instance on the right-hand side of the operator
259 bool operator==(const IteratorT< T >& rhs) const
261 if (__pList != rhs.__pList)
266 if (__index != rhs.__index)
271 if (__isPostEnd != rhs.__isPostEnd)
275 else if (__isPostEnd && rhs.__isPostEnd)
277 // In this case, __currentObj state is invalid
281 // If both this->__isPostEnd and rhs.__isPostEnd are false, then reach here. This means both iterators are in the middle of the list.
282 return __currentObj == rhs.__currentObj;
286 * Checks the two %IteratorT instances for inequality.
290 * @return @c true if every member of the specified %IteratorT instance is not equal to the calling instance's members, @n
292 * @param[in] rhs A reference to the %IteratorT instance on the right-hand side of the operator
294 bool operator!=(const IteratorT< T >& rhs) const
296 return !operator==(rhs);
300 * Exchanges values of the two %IteratorT instances
304 * @param[in] rhs A reference to the %IteratorT instance to swap
306 void swap(IteratorT< T >& rhs)
308 std::swap(__pList, rhs.__pList);
309 std::swap(__isPostEnd, rhs.__isPostEnd);
310 std::swap(__index, rhs.__index);
311 std::swap(__pEnum, rhs.__pEnum);
312 std::swap(__currentObj, rhs.__currentObj);
316 const IList* __pList;
319 std::unique_ptr< IBidirectionalEnumerator > __pEnum;
323 }}} // Tizen::Base::Collection
325 #endif //_FBASE_COL_ITERATOR_T_H_