Java iterators for C++:
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
iterJava.h
Go to the documentation of this file.
1 // iterJava.h (c) 2009 adolfo@di-mare.com
2 
3 #ifdef English_dox
4 /// \file iterJava.h
5 /// \brief Java iterators for C++.
6 /// \author Adolfo Di Mare <adolfo@di-mare.com>
7 /// \date 2009
8 ///
9 /// - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04
10 #endif
11 #ifdef Spanish_dox
12 /// \file iterJava.h
13 /// \brief Iteradores Java para C++.
14 /// \author Adolfo Di Mare <adolfo@di-mare.com>
15 /// \date 2009
16 ///
17 /// - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04
18 #endif
19 
20 #include <iterator> // std::iterator_traits<Iter>
21 
22 template <typename Iter>
23 class iterJava { // Iterate using pointers/iterators
24 protected:
25  Iter itPrev; // Remember last value returned
26  Iter itNext; // Next value to return
27  Iter itEnd; // Past the last value
28  bool isFwd; // false if it is a reverse_iterator
29 public:
31  : itPrev(), itNext(), itEnd(), isFwd(true) { }
32  iterJava( Iter first , Iter end )
33  : itPrev(), itNext(first), itEnd(end), isFwd(true) { }
34  iterJava( const iterJava& o )
35  : itPrev(o.itPrev), itNext(o.itNext)
36  , itEnd (o.itEnd), isFwd(o.isFwd) { }
37  ~iterJava() { }
38  iterJava& operator=( const iterJava& o ) {
39  itPrev = o.itPrev; itNext = o.itNext;
40  itEnd = o.itEnd; isFwd = o.isFwd;
41  return *this;
42  }
43 public:
44  bool hasNext() const {
45  return ( itNext != itEnd );
46  }
47  typename std::iterator_traits<Iter>::
48  reference next() {
49  if (isFwd) {
50  itPrev = itNext; itNext++; return *itPrev;
51  }
52  else {
53  itNext--; itPrev = itNext; return *itPrev;
54  }
55  }
56  typename std::iterator_traits<Iter>::
57  reference current() const { return ( *itPrev ); }
58  operator Iter() const { return itPrev; }
59 public:
60  void set( Iter first , Iter end )
61  { itPrev = Iter(); itNext = first; itEnd = end; isFwd = true; }
62  template <typename C> void set( C& CCC )
63  { set( CCC.begin(), CCC.end() ); }
64  template <typename C> void set( const C& CCC )
65  { set( CCC.begin(), CCC.end() ); }
66  void setReverse() {
67  if ( itPrev==Iter() ) { // didn't start the iteration yet
68  itPrev = itEnd; // swap itNext <==> itEnd
69  itEnd = itNext;
70  itNext = itPrev;
71  // itPrev = itNext; // redundant
72  isFwd = false;
73  }
74  }
75  bool isForward() const { return isFwd; }
76  bool isReverse() const { return !isFwd; }
77  void setBackward() { setReverse(); }
78  bool isBackward() const { return isReverse(); }
79 public:
80  inline friend
81  bool operator== ( const iterJava<Iter>& l , const iterJava<Iter>& r ) {
82  return (
83  l.itPrev == r.itPrev && l.itNext == r.itNext &&
84  l.itEnd == r.itEnd && l.isFwd == r.isFwd );
85  } ///< ( l == r ) ?
86  inline friend
87  bool operator!= ( const iterJava<Iter>& l , const iterJava<Iter>& r )
88  { return !(l==r); } ///< ( l != r ) ?
89 };
90 
91 /*************\
92 |* Doxygen *| ==> http://www.doxygen.org
93 \*************/
94 
95 #ifdef English_dox
96  /// Doxygen English documentation.
97  #define English_dox "Doxygen English documentation"
98  /// \def English_dox ///< Marks English documentation blocks.
99 #endif
100 #ifdef Spanish_dox
101  /// Documentación en español.
102  #define Spanish_dox "Documentación Doxygen en español"
103  /// \def Spanish_dox ///< Marca los bloques de documentación en español.
104 #endif
105 
106 #ifdef English_dox
107 /** \class iterJava;
108  \brief An iterator over a collection.
109  Iterators differ from enumerations in two ways:
110  - Iterators allow the caller to remove elements from the underlying
111  collection during the iteration with well-defined semantics.
112  - Method names have been improved.
113  - In Java, class \c Iterator takes the place of \c Enumeration in the
114  Java collections framework.
115 
116  \dontinclude test_iterJava.cpp
117  \skipline test::example()
118  \until }}
119  \see test_iterJava::test_example()
120 
121  - Both \c const and non-<code>const</code> iterators work as expected.
122 
123  \dontinclude test_iterJava.cpp
124  \skipline test::const_example()
125  \until }}
126  \see test_iterJava::test_const_example()
127 
128  - On vectors operation \c remove() cannot be used.
129 
130  \dontinclude test_iterJava.cpp
131  \skipline test::examplePtr()
132  \until }}
133  \see test_iterJava::test_examplePtr()
134 */
135 #endif
136 #ifdef Spanish_dox
137 /** \class iterJava;
138  \brief Iterador sobre una colección.
139  Los iteradores difieren de las enumeraciones en 2 formas:
140  - Los iteradores permiten que el invocador borre valores de la
141  colección que se recorre durante la iteración, con semántica bien definida.
142  - Los nombres de los métodos han sido mejorados.
143  - En Java, la clase \c Iterator toma el lugar de \c Enumeration
144  en el marco de trabajo de colecciones (<em>Java collections framework</em>).
145 
146  \dontinclude test_iterJava.cpp
147  \skipline test::example()
148  \until }}
149  \see test_iterJava::test_example()
150 
151  - Tanto los iteradores \c const como no-<code>const</code> trabajan
152  como se espera.
153 
154  \dontinclude test_iterJava.cpp
155  \skipline test::const_example()
156  \until }}
157  \see test_iterJava::test_const_example()
158 
159  - En vectores la operación \c remove() no puede ser useda.
160 
161  \dontinclude test_iterJava.cpp
162  \skipline test::examplePtr()
163  \until }}
164  \see test_iterJava::test_examplePtr()
165 */
166 #endif
167 
168 #ifdef English_dox
169 /**
170  \brief Remember last value returned.
171  \var iterJava::itPrev;
172 */
173 /**
174  \brief Next value to return.
175  \var iterJava::itNext;
176 */
177 /**
178  \brief Past the last value.
179  \var iterJava::itEnd;
180 */
181 /**
182  \brief \c "false" if it is a \c reverse_iterator.
183  \var iterJava::isFwd;
184 */
185 #endif
186 #ifdef Spanish_dox
187 /**
188  \brief Recuerda el último valor retornado.
189  \var iterJava::itPrev;
190 */
191 /**
192  \brief Siguiente valor por retornar.
193  \var iterJava::itNext;
194 */
195 /**
196  \brief Pasado del último valor.
197  \var iterJava::itEnd;
198 */
199 /**
200  \brief \c "false" si es un \c reverse_iterator.
201  \var iterJava::isFwd;
202 */
203 #endif
204 
205 #ifdef English_dox
206 /**
207  \fn iterJava::iterJava( );
208  \brief Default constructor.
209 
210  \fn iterJava::iterJava( Iter first , Iter end );
211  \brief Constructor to traverse from \c first up to \c end.
212 
213  \fn iterJava::iterJava( const iterJava& o );
214  \brief Copy constructor.
215 
216  \fn iterJava::~iterJava( );
217  \brief Destructor.
218 
219  \fn iterJava::operator=( const iterJava& o );
220  \brief Copy.
221 
222  \dontinclude test_iterJava.cpp
223  \skipline test::assign()
224  \until }}
225  \see test_iterJava::test_assign()
226 */
227 #endif
228 #ifdef Spanish_dox
229 /**
230  \fn iterJava::iterJava( );
231  \brief Constructor por defecto.
232 
233  \fn iterJava::iterJava( Iter first , Iter end );
234  \brief Constructor para recorrer desde \c first y hasta antes de \c end.
235 
236  \fn iterJava::iterJava( const iterJava& o );
237  \brief Constructor de copia.
238 
239  \fn iterJava::~iterJava( );
240  \brief Destructor.
241 
242  \fn iterJava::operator=( const iterJava& o );
243  \brief Copiador.
244 
245  \dontinclude test_iterJava.cpp
246  \skipline test::assign()
247  \until }}
248  \see test_iterJava::test_assign()
249 */
250 #endif
251 
252 #ifdef English_dox
253 /**
254  \fn iterJava::hasNext() const;
255  \brief Returns \c true if the iteration has more elements.
256  (In other words, returns \c true if \c next() would return an element
257  rather than breaking up.)
258  \returns \c true if the iterator has more elements.
259 
260  \fn iterJava::next();
261  \brief Returns the next element in the iteration.
262  Calling this method repeatedly until the \c hasNext() method returns
263  \c false will return each element in the underlying collection exactly once.
264  \returns The next element in the iteration.
265 
266  \dontinclude test_iterJava.cpp
267  \skipline test::next()
268  \until }}
269  \see test_iterJava::test_next()
270 
271  \fn iterJava::current() const;
272  \brief Returns the value that the last invocation to \c next() returned.
273  - Calling this method after the iterator was set but before
274  the first invocation to \c next() is an error.
275  \returns The value that the last invocation to \c next() returned.
276 
277  \fn iterJava::operator Iter() const;
278  \brief Converts into an iterator over the underlying collection.
279 
280  - This conversion is usefull to remove from the underlaying collection the
281  last value returned by \c next().
282  - This conversion works both for \c const and non \c const iterations.
283 
284  \returns The value that the last invocation to \c next() returned.
285 
286  \dontinclude test_iterJava.cpp
287  \skipline test::erase()
288  \until }}
289  \see test_iterJava::test_erase()
290 
291 */
292 #endif
293 #ifdef Spanish_dox
294 /**
295  \fn iterJava::hasNext() const;
296  \brief Retorna \c true si la iteración tiene más elementos.
297  (En otras palabras, retorna \c true si \c next() retornaría un elemento
298  en lugar de fallar.)
299  \returns \c true si la iteración tiene más elementos.
300 
301  \fn iterJava::next();
302  \brief Retorna el siguiente element de la iteración.
303  Al invocar este método repetidamente hasta que el método \c hasNext() retorne
304  \c false retornará cada elemento de la collección que se recorre exactamente
305  una vez.
306  \returns El siguiente element de la iteración.
307 
308  \dontinclude test_iterJava.cpp
309  \skipline test::next()
310  \until }}
311  \see test_iterJava::test_next()
312 
313  \fn iterJava::current() const;
314  \brief Retorna el valor que la última invocación de \c next() retornó.
315  - Invocar este método después de que el valor del iterador iterador fue establecido
316  pero antes de la primera invocación de \c next() es aun error.
317  \returns El valor que la última invocación de \c next() retornó.
318 
319  \fn iterJava::operator Iter() const;
320  \brief Convierte el valor en un iterador sobre la colección que se recorre.
321 
322  - Este convertidor es útil para eliminar valores de la colección que se recorre
323  el último valor que \c next() retornó.
324  - La conversión funciona para operaciones \c const y para las que no son \c const.
325 
326  \returns El valor que la última invocación de \c next() retornó.
327 
328  \dontinclude test_iterJava.cpp
329  \skipline test::erase()
330  \until }}
331  \see test_iterJava::test_erase()
332 */
333 #endif
334 
335 #ifdef English_dox
336 /**
337  \fn iterJava::set( Iter first , Iter end );
338  \brief Resets the iterator to traverse from \c first up to \c end.
339 
340  \fn iterJava::set( C& CCC );
341  \brief Resets the iterator to traverse from \c C.
342 
343  \fn iterJava::set( const C& CCC );
344  \brief Resets the iterator to traverse from \c C (\c const version).
345 
346  \dontinclude test_iterJava.cpp
347  \skipline test::set_CCC()
348  \until }}
349  \see test_iterJava::test_set_CCC()
350 */
351 #endif
352 #ifdef Spanish_dox
353 /**
354  \fn iterJava::set( Iter first , Iter end );
355  \brief Establece que la iteración se hará desde \c first hasta antes de \c end.
356 
357  \fn iterJava::set( C& CCC );
358  \brief Establece que la iteración se hará sobre \c C.
359 
360  \fn iterJava::set( const C& CCC );
361  \brief Establece que la iteración se hará sobre \c C ( versión \c const ).
362 
363  \dontinclude test_iterJava.cpp
364  \skipline test::set_CCC()
365  \until }}
366  \see test_iterJava::test_set_CCC()
367 */
368 #endif
369 
370 #ifdef English_dox
371 /**
372  \fn iterJava::setReverse();
373  \brief Sets the iterator to go reverse (backwards).
374  \pre Method \c next() must not be invoked before using \c setReverse().
375  \see isPalindrome();
376 
377  \dontinclude test_iterJava.cpp
378  \skipline test::palindrome()
379  \until }}
380  \see test_iterJava::test_palindrome()
381  \see isPalindrome();
382 
383  \fn iterJava::isForward() const;
384  \brief Returns \c true if the iteration is natural, from first to last.
385 
386  \fn iterJava::isReverse() const;
387  \brief Returns \c true if the iteration goes in reverse (backwards).
388  - Only after \c setReverse() is invoked will \c isReverse() return \c true.
389 
390  \dontinclude test_iterJava.cpp
391  \skipline test::setReverse()
392  \until }}
393  \see test_iterJava::test_setReverse()
394 
395  \fn iterJava::setBackward();
396  \brief Sets the iterator to go reverse (backwards).
397  \pre Method \c next() must not be invoked before using \c setReverse().
398  - Handy sinomim for \c setReverse().
399 
400  \fn iterJava::isBackward() const;
401  \brief Returns \c true if the iteration goes in reverse (backwards).
402  - Only after \c setReverse() is invoked will \c isReverse() return \c true.
403  - Handy sinomim for \c isReverse().
404 
405  \dontinclude test_iterJava.cpp
406  \skipline test::setReverse()
407  \until }}
408  \see test_iterJava::test_setReverse()
409 */
410 #endif
411 #ifdef Spanish_dox
412 /**
413  \fn iterJava::setReverse();
414  \brief Establece que el iterador irá hacia atrás, en reversa.
415  \pre No debe invocarse el método \c next() antes de usar \c setReverse().
416  \see isPalindrome();
417 
418  \dontinclude test_iterJava.cpp
419  \skipline test::palindrome()
420  \until }}
421  \see test_iterJava::test_palindrome()
422  \see isPalindrome();
423 
424  \fn iterJava::isForward() const;
425  \brief Retorna \c true si la iteración es natural, desde el primero al útlimo.
426 
427  \fn iterJava::isReverse() const;
428  \brief Retorna \c true si la iteración va hacia atrás, en reversa.
429  - Solo después de que \c setReverse() ocurrirá que \c isReverse() retorne \c true.
430 
431  \dontinclude test_iterJava.cpp
432  \skipline test::setReverse()
433  \until }}
434  \see test_iterJava::test_setReverse()
435 
436  \fn iterJava::setBackward();
437  \brief Establece que el iterador irá hacia atrás, en reversa.
438  \pre No debe invocarse el método \c next() antes de usar \c setBackward().
439  - Cómodo sinónimo de \c setReverse().
440 
441  \fn iterJava::isBackward() const;
442  \brief Retorna \c true si la iteración va hacia atrás, en reversa.
443  - Solo después de que \c setBackward() ocurrirá que \c isBackward() retorne \c true.
444  - Cómodo sinónimo de \c isReverse().
445 
446  \dontinclude test_iterJava.cpp
447  \skipline test::setReverse()
448  \until }}
449  \see test_iterJava::test_setReverse()
450 */
451 #endif
452 
453 #ifdef English_dox
454 #endif
455 #ifdef Spanish_dox
456 #endif
457 
458 // EOF: iterJava.h
friend bool operator!=(const iterJava< Iter > &l, const iterJava< Iter > &r)
( l != r ) ?
Definition: iterJava.h:87
An iterator over a collection.
Definition: iterJava.h:23
void set(Iter first, Iter end)
Resets the iterator to traverse from first up to end.
Definition: iterJava.h:60
void set(C &CCC)
Resets the iterator to traverse from C.
Definition: iterJava.h:62
Iter itPrev
Remember last value returned.
Definition: iterJava.h:25
friend bool operator==(const iterJava< Iter > &l, const iterJava< Iter > &r)
( l == r ) ?
Definition: iterJava.h:81
bool isBackward() const
Returns true if the iteration goes in reverse (backwards).
Definition: iterJava.h:78
iterJava(const iterJava &o)
Copy constructor.
Definition: iterJava.h:34
Iter itNext
Next value to return.
Definition: iterJava.h:26
std::iterator_traits< Iter >::reference next()
Returns the next element in the iteration.
Definition: iterJava.h:48
bool isReverse() const
Returns true if the iteration goes in reverse (backwards).
Definition: iterJava.h:76
void set(const C &CCC)
Resets the iterator to traverse from C (const version).
Definition: iterJava.h:64
void setReverse()
Sets the iterator to go reverse (backwards).
Definition: iterJava.h:66
bool isForward() const
Returns true if the iteration is natural, from first to last.
Definition: iterJava.h:75
iterJava(Iter first, Iter end)
Constructor to traverse from first up to end.
Definition: iterJava.h:32
~iterJava()
Destructor.
Definition: iterJava.h:37
iterJava()
Default constructor.
Definition: iterJava.h:30
std::iterator_traits< Iter >::reference current() const
Returns the value that the last invocation to next() returned.
Definition: iterJava.h:57
bool hasNext() const
Returns true if the iteration has more elements.
Definition: iterJava.h:44
iterJava & operator=(const iterJava &o)
Copy.
Definition: iterJava.h:38
Iter itEnd
Past the last value.
Definition: iterJava.h:27
void setBackward()
Sets the iterator to go reverse (backwards).
Definition: iterJava.h:77
bool isFwd
&quot;false&quot; if it is a reverse_iterator.
Definition: iterJava.h:28