Ilwis-Objects  1.0
GIS and Remote Sensing framework for data access and processing
 All Classes Functions Enumerations Pages
itemiterator.h
1 #ifndef ITEMITERATOR_H
2 #define ITEMITERATOR_H
3 
4 namespace Ilwis {
5 template<class C> class ItemDomain;
6 
7 template<typename T> class ItemIterator : public std::iterator<std::random_access_iterator_tag, T>
8 {
9 public:
10 
14  ItemIterator() : _current(0){
15 
16  }
17 
25  ItemIterator( const IlwisData<ItemDomain<T>>& dom, quint32 cur=0) : _current(cur), _range(dynamic_cast<ItemRange *>(dom->_range.data())){
26 
27  }
28 
36  ItemIterator( const ItemDomain<T>& dom, quint32 cur=0) : _current(cur), _range(dynamic_cast<ItemRange *>(dom._range.data())){
37 
38  }
39 
46  ItemIterator( ItemRange *rng, quint32 cur=0) : _current(cur), _range(rng){
47 
48  }
49 
55  ItemIterator(const ItemIterator& iter) {
56  _current = iter._current;
57  _range = iter._range;
58  }
59 
69  _current = iter._current;
70  _range = iter._range;
71  return *this;
72  }
73 
81  move(1);
82  return *this;
83  }
84 
92  move(-1);
93  return *this;
94  }
95 
104  move(n);
105  return *this;
106  }
107 
116  move(-n);
117  return *this;
118  }
119 
129  return _range == iter._range && _current < iter._current;
130  }
131 
141  return _range == iter._range && _current > iter._current;
142  }
143 
153  return _range == iter._range && _current <= iter._current;
154  }
155 
165  return _range == iter._range && _current >= iter._current;
166  }
167 
172  T *operator*() {
173  if ( _current != iUNDEF) {
174  T *obj = static_cast<T *>(_range->itemByOrder(_current).data());
175  return obj;
176  }
177  return 0;
178  }
179 
187  ItemIterator temp = *this;
188  move(1);
189  return temp;
190  }
191 
199  ItemIterator temp = *this;
200  move(-1);
201  return temp;
202  }
203 
211  ItemIterator& operator[](quint32 index) {
212  _range->gotoIndex(0, index);
213  }
214 
223  bool operator==(const ItemIterator& iter) const{
224  return _current != iUNDEF && iter._current!= iUNDEF && _current == iter._current && _range ==iter._range;
225  }
226 
235  bool operator!=(const ItemIterator& iter) const{
236  return !operator==(iter);
237  }
238 
244  bool isValid() {
245  return _range->isValid() && _current <_range->count();
246  }
247 
253  ItemIterator begin() const {
254  return ItemIterator(_range,0);
255  }
256 
262  ItemIterator end() const {
263  return ItemIterator(_range,_range->count());
264  }
265 
266 private:
267  void move(qint32 n) {
268  _current = _range->gotoIndex(_current, n);
269  }
270 
271  quint32 _current;
272  ItemRange *_range;
273 };
274 
275 template<typename T> ItemIterator<T> operator+(const ItemIterator<T>& iter, int n) {
276  ItemIterator<T> iterTemp(iter);
277  iterTemp += n;
278  return iter;
279 }
280 
281 template<typename T> ItemIterator<T> operator-(const ItemIterator<T>& iter, int n) {
282  ItemIterator<T> iterTemp(iter);
283  iterTemp -= n;
284  return iter;
285 }
286 
287 template<typename T> ItemIterator<T> operator+(int n, const ItemIterator<T>& iter) {
288  ItemIterator<T> iterTemp(iter);
289  iterTemp += n;
290  return iter;
291 }
292 
293 template<typename T> ItemIterator<T> operator-(int n,const ItemIterator<T>& iter) {
294  ItemIterator<T> iterTemp(iter);
295  iterTemp -= n;
296  return iter;
297 }
298 
299 }
300 #endif // ITEMITERATOR_H