BALL  1.4.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
forwardFilterIterator.h
Go to the documentation of this file.
1 #ifndef BALL_LINALG_FORWARDFILTERITERATOR_H
2 #define BALL_LINALG_FORWARDFILTERITERATOR_H
3 
4 #ifndef BALL_LINALG_BASEFILTERITERATOR_H
6 #endif
7 
8 namespace BALL
9 {
10 
14 
17  template <class Predicate, class IteratorForward>
19  : public BaseFilterIterator<Predicate, IteratorForward>
20  {
21  public:
22 
26 
27 
29  typedef typename IteratorForward::container_type Container;
31  typedef typename IteratorForward::value_type DataType;
33  typedef typename IteratorForward::difference_type Position;
35  typedef typename IteratorForward::traits_type Traits;
37  typedef typename IteratorForward::value_type value_type;
39  typedef typename IteratorForward::difference_type difference_type;
41  typedef typename IteratorForward::pointer pointer;
43  typedef typename IteratorForward::reference reference;
45  typedef std::forward_iterator_tag iterator_category;
49 
53 
56 
59  : BaseFilterIterator<Predicate, IteratorForward>(p,it)
60  {
61  while (!isEnd() && !Base::predicate_(Base::getTraits().getData()))
62  Base::getTraits().forward();
63  }
64 
67  : BaseFilterIterator<Predicate, IteratorForward>(iterator)
68  {
69  }
70 
73 
75 
79 
81  {
82  Base::operator = (iterator);
83  return *this;
84  }
85 
88  {
91  }
93 
95  void setIterator(const IteratorForward& iterator)
96  {
97  Base::iterator_ = iterator;
98 
99  while (!isEnd() && !Base::predicate_(Base::getTraits().getData()))
100  Base::getTraits().forward();
101  }
102 
104  const IteratorForward& getIterator() const { return Base::iterator_; }
105 
108 
112 
116  void toBegin();
117 
119  bool isBegin() const;
120 
124  void toEnd();
125 
127  bool isEnd() const;
128 
132  static ConstForwardFilterIterator begin(const Container& container);
133 
137  static ConstForwardFilterIterator end(const Container& container);
138 
143  {
144  if (!Base::isValid())
145  {
147  throw(e);
148  }
149  Base::getTraits().forward();
150 
151  while (!isEnd() && !Base::predicate_(Base::getTraits().getData()))
152  Base::getTraits().forward();
153  return *this;
154  }
155 
160  {
161  if (!IteratorForward::isValid())
162  {
164  throw(e);
165  }
166  ConstForwardFilterIterator tmp(*this);
167  ++(*this);
168  return tmp;
169  }
170 
172 
173  protected:
174 
176  template <typename Container>
178  : BaseFilterIterator<Predicate, IteratorForward>(container)
179  {
180  }
181 
182  };
184 
185  template <class Predicate, class IteratorForward>
187  {
188  if (IteratorForward::isSingular())
189  {
191  throw(e);
192  }
193  Base::getTraits().toBegin();
194  }
195 
196  template <class Predicate, class IteratorForward>
199  {
201  iterator.toBegin();
202  return iterator;
203  }
204 
205  template <class Predicate, class IteratorForward>
207  {
208  if (Base::getTraits().isSingular())
209  {
210  return false;
211  }
212  return Base::getTraits().isBegin();
213  }
214 
215  template <class Predicate, class IteratorForward>
217  {
218  if (Base::isSingular())
219  {
221  throw(e);
222  }
223  Base::getTraits().toEnd();
224  }
225 
226  template <class Predicate, class IteratorForward>
229  {
231  iterator.toEnd();
232  return iterator;
233  }
234 
235  template <class Predicate, class IteratorForward>
237  {
238  if (Base::isSingular())
239  {
240  return false;
241  }
242  return Base::getTraits().isEnd();
243  }
244 
247  template <class Predicate, class IteratorForward>
249  : public ConstForwardFilterIterator<Predicate, IteratorForward>
250  {
251  public:
252 
256 
258  typedef typename IteratorForward::container_type Container;
260  typedef typename IteratorForward::value_type DataType;
262  typedef typename IteratorForward::difference_type Position;
264  typedef typename IteratorForward::traits_type Traits;
266  typedef typename IteratorForward::value_type value_type;
268  typedef typename IteratorForward::difference_type difference_type;
270  typedef typename IteratorForward::pointer pointer;
272  typedef typename IteratorForward::reference reference;
275 
277 
281 
284 
287  : ConstForwardFilterIterator<Predicate, IteratorForward>(p,it)
288  {
289  }
290 
293  : ConstForwardFilterIterator<Predicate, IteratorForward>(iterator)
294  {
295  }
296 
300 
304 
306  {
307  Base::operator = (iterator);
308  return *this;
309  }
310 
312 
314  void swap(ForwardFilterIterator& iterator)
315  {
318  }
320 
324 
328  static ForwardFilterIterator begin(const Container& container);
329 
333  static ForwardFilterIterator end(const Container& container);
334 
337  {
338  return Base::getTraits().getData();
339  }
340 
343  {
344  return &Base::getTraits().getData();
345  }
346 
351  {
352  if (!Base::isValid())
353  {
355  throw(e);
356  }
357 
358  while (!Base::isEnd() && !Base::predicate_(Base::getTraits().getData()))
359  Base::getTraits().forward();
360  return *this;
361  }
362 
367  {
368  if (!Base::isValid())
369  {
371  throw(e);
372  }
373  ForwardFilterIterator tmp(*this);
374  ++(*this);
375  return tmp;
376  }
377 
379 
380  protected:
381 
384  : ConstForwardFilterIterator<Predicate, IteratorForward>(container)
385  {
386  }
387  };
388 
389 
390  template <class Predicate, class IteratorForward>
391  ForwardFilterIterator<Predicate, IteratorForward>
393  {
394  ForwardFilterIterator iterator(container);
395  iterator.toBegin();
396  return iterator;
397  }
398 
399  template <class Predicate, class IteratorForward>
402  {
403  ForwardFilterIterator iterator(container);
404  iterator.toEnd();
405  return iterator;
406  }
407 
408 
409 } // namespace BALL
410 
411 #endif // BALL_KERNEL_FORWARDFILTERITERATOR_H