BALL  1.5.0
bidirectionalIterator.h
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #ifndef BALL_CONCEPT_BIDIRECTIONALITERATOR_H
6 #define BALL_CONCEPT_BIDIRECTIONALITERATOR_H
7 
8 #ifndef BALL_CONCEPT_FORWARDITERATOR_H
10 #endif
11 
12 namespace BALL
13 {
14 
19 
22  template <typename Container, typename DataType, typename Position, typename Traits>
24  : public ConstForwardIterator<Container, DataType, Position, Traits>
25  {
26  public:
27 
31 
33  typedef std::bidirectional_iterator_tag iterator_category;
34  // convenience typedef
37 
41 
44 
47  : Base(iterator)
48  {
49  }
50 
54 
58 
62  BALL_INLINE void toBegin();
63 
65  BALL_INLINE bool isBegin() const { return Base::getTraits().isBegin(); }
66 
70  void toEnd();
71 
73  BALL_INLINE bool isEnd() const { return Base::getTraits().isEnd(); }
74 
78  void toRBegin();
79 
81  BALL_INLINE bool isRBegin() const { return Base::getTraits().isRBegin(); }
82 
86  void toREnd();
87 
89  BALL_INLINE bool isREnd() const { return Base::getTraits().isREnd(); }
90 
95 
100 
105 
110 
114  static ConstBidirectionalIterator begin(const Container& container);
115 
119  static ConstBidirectionalIterator end(const Container& container);
120 
124  static ConstBidirectionalIterator rbegin(const Container& container);
125 
129  static ConstBidirectionalIterator rend(const Container& container);
131 
132  protected:
133 
135  BALL_INLINE ConstBidirectionalIterator(const Container& container)
136  : Base(container)
137  {
138  }
139  };
141 
142  template <typename Container, typename DataType, typename Position, typename Traits>
145  {
146  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot set unbound iterator to begin")
147  Base::getTraits().toBegin();
148  }
149 
150  template <typename Container, typename DataType, typename Position, typename Traits>
153  {
154  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot set unbound iterator to end")
155  Base::getTraits().toEnd();
156  }
157 
158  template <typename Container, typename DataType, typename Position, typename Traits>
161  {
162  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot set unbound iterator to reverse begin")
163  Base::getTraits().toRBegin();
164  }
165 
166  template <typename Container, typename DataType, typename Position, typename Traits>
169  {
170  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot set unbound iterator to reverse end")
171  Base::getTraits().toREnd();
172  }
173 
174  template <typename Container, typename DataType, typename Position, typename Traits>
178  {
179  BALL_PRECONDITION_EXCEPTION(Base::getTraits().isValid(), "cannot increment an invalid iterator")
180  Base::getTraits().forward();
181  return *this;
182  }
183 
184  template <typename Container, typename DataType, typename Position, typename Traits>
188  {
189  BALL_PRECONDITION_EXCEPTION(Base::getTraits().isValid(), "cannot increment an invalid iterator")
190  ConstBidirectionalIterator iterator(*this);
191  ++(*this);
192  return iterator;
193  }
194 
195  template <typename Container, typename DataType, typename Position, typename Traits>
199  {
200  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot decrement unbound iterator")
201  Base::getTraits().backward();
202  return *this;
203  }
204 
205  template <typename Container, typename DataType, typename Position, typename Traits>
209  {
210  BALL_PRECONDITION_EXCEPTION(!Base::getTraits().isSingular(), "cannot decrement an unbound iterator")
211  ConstBidirectionalIterator iterator(*this);
212  --(*this);
213  return iterator;
214  }
215 
216  template <typename Container, typename DataType, typename Position, typename Traits>
220  {
221  ConstBidirectionalIterator iterator(container);
222  iterator.toBegin();
223  return iterator;
224  }
225 
226  template <typename Container, typename DataType, typename Position, typename Traits>
230  {
231  ConstBidirectionalIterator iterator(container);
232  iterator.toEnd();
233  return iterator;
234  }
235 
236  template <typename Container, typename DataType, typename Position, typename Traits>
240  {
241  ConstBidirectionalIterator iterator(container);
242  iterator.toRBegin();
243  return iterator;
244  }
245 
246  template <typename Container, typename DataType, typename Position, typename Traits>
250  {
251  ConstBidirectionalIterator iterator(container);
252  iterator.toREnd();
253  return iterator;
254  }
255 
257  template <typename Container, typename DataType, typename Position, typename Traits>
259  : public ConstBidirectionalIterator<Container, DataType, Position, Traits>
260  {
261  public:
262 
266 
268  typedef DataType& reference;
270  typedef DataType* pointer;
271  // convenience typedef
274 
278 
281 
284 
285  : ConstBidirectionalIterator<Container, DataType, Position, Traits>(iterator)
286  {
287  }
288 
291 
293 
297 
299  BALL_INLINE reference operator * () const { return (reference)Base::getTraits().getData(); }
300 
302  BALL_INLINE pointer operator -> () const { return (pointer)&Base::getTraits().getData(); }
303 
308 
313 
318 
323 
327  static BidirectionalIterator begin(const Container& container);
328 
332  static BidirectionalIterator end(const Container& container);
333 
337  static BidirectionalIterator rbegin(const Container& container);
338 
342  static BidirectionalIterator rend(const Container& container);
344 
345  protected:
346 
348  BALL_INLINE BidirectionalIterator(const Container& container) ;
349  };
350 
351 
352  template <typename Container, typename DataType, typename Position, typename Traits>
354  BidirectionalIterator<Container, DataType, Position, Traits>&
356  {
357  Base::operator ++ ();
358  return *this;
359  }
360 
361  template <typename Container, typename DataType, typename Position, typename Traits>
365  {
366  BidirectionalIterator iterator(*this);
367  this->operator ++ ();
368  return iterator;
369  }
370 
371  template <typename Container, typename DataType, typename Position, typename Traits>
375  {
376  Base::operator -- ();
377  return *this;
378  }
379 
380  template <typename Container, typename DataType, typename Position, typename Traits>
384  {
385  BidirectionalIterator iterator(*this);
386  this->operator -- ();
387  return iterator;
388  }
389 
390  template <typename Container, typename DataType, typename Position, typename Traits>
394  {
395  BidirectionalIterator iterator(container);
396  iterator.toBegin();
397  return iterator;
398  }
399 
400  template <typename Container, typename DataType, typename Position, typename Traits>
404  {
405  BidirectionalIterator iterator(container);
406  iterator.toEnd();
407  return iterator;
408  }
409 
410  template <typename Container, typename DataType, typename Position, typename Traits>
414  {
415  BidirectionalIterator iterator(container);
416  iterator.toRBegin();
417  return iterator;
418  }
419 
420  template <typename Container, typename DataType, typename Position, typename Traits>
424  {
425  BidirectionalIterator iterator(container);
426  iterator.toREnd();
427  return iterator;
428  }
429 
430  template <typename Container, typename DataType, typename Position, typename Traits>
433 
434  : ConstBidirectionalIterator<Container, DataType, Position, Traits>(container)
435  {
436  }
437 
438 
439 } // namespace BALL
440 
441 #endif // BALL_CONCEPT_BIDIRECTIONALITERATOR_H
BALL::BidirectionalIterator::rend
static BidirectionalIterator rend(const Container &container)
Definition: bidirectionalIterator.h:423
BALL_INLINE
#define BALL_INLINE
Definition: debug.h:15
BALL_PRECONDITION_EXCEPTION
#define BALL_PRECONDITION_EXCEPTION(condition, message)
Definition: debug.h:89
BALL::ConstBidirectionalIterator::isBegin
BALL_INLINE bool isBegin() const
Check whether the iterator points to the item at the beginning of the container.
Definition: bidirectionalIterator.h:65
BALL::ConstBidirectionalIterator::toRBegin
void toRBegin()
Definition: bidirectionalIterator.h:160
BALL::BidirectionalIterator::reference
DataType & reference
Definition: bidirectionalIterator.h:268
BALL::ConstBidirectionalIterator
Definition: bidirectionalIterator.h:23
BALL::BidirectionalIterator::end
static BidirectionalIterator end(const Container &container)
Definition: bidirectionalIterator.h:403
BALL::ConstBidirectionalIterator::operator--
BALL_INLINE ConstBidirectionalIterator & operator--()
Definition: bidirectionalIterator.h:198
BALL::ConstForwardIterator
Definition: forwardIterator.h:24
BALL::ConstBidirectionalIterator::operator++
BALL_INLINE ConstBidirectionalIterator & operator++()
Definition: bidirectionalIterator.h:177
BALL::ConstBidirectionalIterator::Base
ConstForwardIterator< Container, DataType, Position, Traits > Base
Definition: bidirectionalIterator.h:35
BALL::ConstBidirectionalIterator::rend
static ConstBidirectionalIterator rend(const Container &container)
Definition: bidirectionalIterator.h:249
BALL::BidirectionalIterator::BidirectionalIterator
BALL_INLINE BidirectionalIterator()
Default constructor.
Definition: bidirectionalIterator.h:280
BALL_SIZE_TYPE
BALL::ConstBidirectionalIterator::begin
static ConstBidirectionalIterator begin(const Container &container)
Definition: bidirectionalIterator.h:219
BALL::ConstBidirectionalIterator::isREnd
BALL_INLINE bool isREnd() const
Test wheter the iterator points to the position before the first element.
Definition: bidirectionalIterator.h:89
BALL::ConstBidirectionalIterator::end
static ConstBidirectionalIterator end(const Container &container)
Definition: bidirectionalIterator.h:229
BALL::BidirectionalIterator::operator--
BALL_INLINE BidirectionalIterator & operator--()
Definition: bidirectionalIterator.h:374
BALL::BidirectionalIterator::operator->
BALL_INLINE pointer operator->() const
Pointer dereferentiation.
Definition: bidirectionalIterator.h:302
BALL::BidirectionalIterator::Base
ConstBidirectionalIterator< Container, DataType, Position, Traits > Base
Definition: bidirectionalIterator.h:272
BALL
Definition: constants.h:12
BALL::ConstBidirectionalIterator::iterator_category
std::bidirectional_iterator_tag iterator_category
Definition: bidirectionalIterator.h:33
BALL::ConstBidirectionalIterator::isRBegin
BALL_INLINE bool isRBegin() const
Test whether the iterator points to the "reverse" first element of the container.
Definition: bidirectionalIterator.h:81
BALL::ConstBidirectionalIterator::toREnd
void toREnd()
Definition: bidirectionalIterator.h:168
BALL::BaseIterator::getTraits
const BALL_INLINE Traits & getTraits() const
Get a constant reference to the traits of this iterator.
Definition: baseIterator.h:130
BALL::ConstBidirectionalIterator::toEnd
void toEnd()
Definition: bidirectionalIterator.h:152
BALL::BidirectionalIterator::BidirectionalIterator
BALL_INLINE BidirectionalIterator(const BidirectionalIterator &iterator)
Copy constructor.
Definition: bidirectionalIterator.h:283
BALL::ConstBidirectionalIterator::~ConstBidirectionalIterator
BALL_INLINE ~ConstBidirectionalIterator()
Definition: bidirectionalIterator.h:52
BALL::ConstBidirectionalIterator::ConstBidirectionalIterator
BALL_INLINE ConstBidirectionalIterator(const Container &container)
Construct an iterator bound to a specific container.
Definition: bidirectionalIterator.h:135
BALL::ConstBidirectionalIterator::isEnd
BALL_INLINE bool isEnd() const
Check whether the iterator points to the position after the last item of the container.
Definition: bidirectionalIterator.h:73
BALL::Composite
Definition: composite.h:71
BALL::BidirectionalIterator::~BidirectionalIterator
BALL_INLINE ~BidirectionalIterator()
Destructor.
Definition: bidirectionalIterator.h:290
BALL::BidirectionalIterator::rbegin
static BidirectionalIterator rbegin(const Container &container)
Definition: bidirectionalIterator.h:413
BALL::BidirectionalIterator
Mutable bidirectional iterator.
Definition: bidirectionalIterator.h:258
BALL::ConstBidirectionalIterator::ConstBidirectionalIterator
BALL_INLINE ConstBidirectionalIterator()
Definition: bidirectionalIterator.h:43
BALL::BidirectionalIterator::operator*
BALL_INLINE reference operator*() const
Dereferentiation.
Definition: bidirectionalIterator.h:299
BALL::BidirectionalIterator::begin
static BidirectionalIterator begin(const Container &container)
Definition: bidirectionalIterator.h:393
BALL::ConstBidirectionalIterator::ConstBidirectionalIterator
BALL_INLINE ConstBidirectionalIterator(const ConstBidirectionalIterator &iterator)
Definition: bidirectionalIterator.h:46
BALL::ConstBidirectionalIterator::rbegin
static ConstBidirectionalIterator rbegin(const Container &container)
Definition: bidirectionalIterator.h:239
forwardIterator.h
BALL::BidirectionalIterator::operator++
BALL_INLINE BidirectionalIterator & operator++()
Definition: bidirectionalIterator.h:355
BALL::BidirectionalIterator::pointer
DataType * pointer
Definition: bidirectionalIterator.h:270
BALL::ConstBidirectionalIterator::toBegin
BALL_INLINE void toBegin()
Definition: bidirectionalIterator.h:144