Elm  2
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
iter.h
1 /*
2  * Tool classes for iterators.
3  *
4  * This file is part of OTAWA
5  * Copyright (c) 2019, IRIT UPS.
6  *
7  * OTAWA is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * OTAWA is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with OTAWA; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef ELM_ITER_H_
22 #define ELM_ITER_H_
23 
24 namespace elm {
25 
26 // PreIterator class
27 template <class I, class T>
28 class PreIterator {
29 public:
30  typedef T t;
31  typedef T return_t;
32 
33  inline bool operator()() const { return !((I *)this)->ended(); }
34  inline bool operator!() const { return ((I *)this)->ended(); }
35 
36  inline T operator*() const { return ((I *)this)->item(); }
37  inline T operator->() const { return ((I *)this)->item(); }
38 
39  inline I& operator++() { ((I *)this)->next(); return *(I *)this; }
40  inline void operator++(int) { ((I *)this)->next(); }
41 
42  inline bool operator==(const I& i) const { return ((I *)this)->equals(i); }
43  inline bool operator!=(const I& i) const { return !((I *)this)->equals(i); }
44 
45 };
46 
47 // InplacePreIterator class
48 template <class I, class T>
50 public:
51  typedef T t;
52  typedef const T& return_t;
53 
54  inline bool operator()() const { return !((I *)this)->ended(); }
55  inline bool operator!() const { return ((I *)this)->ended(); }
56 
57  inline const T& operator*() const { return ((I *)this)->item(); }
58  inline const T& operator->() const { return ((I *)this)->item(); }
59 
60  inline I& operator++() { ((I *)this)->next(); return *(I *)this; }
61  inline void operator++(int) { ((I *)this)->next(); }
62 
63  inline bool operator==(const I& i) const { return ((I *)this)->equals(i); }
64  inline bool operator!=(const I& i) const { return !((I *)this)->equals(i); }
65 
66 };
67 
68 template <class I, class T>
69 class PreIter {
70 public:
71  typedef T t;
72  inline bool operator()() const { return !((I *)this)->ended(); }
73  inline bool operator!() const { return ((I *)this)->ended(); }
74 
75  inline I& operator++() { ((I *)this)->next(); return *(I *)this; }
76  inline void operator++(int) { ((I *)this)->next(); }
77 
78  inline bool operator==(const I& i) const { return ((I *)this)->equals(i); }
79  inline bool operator!=(const I& i) const { return !((I *)this)->equals(i); }
80 
81 };
82 
83 template <class I, class T>
84 class ConstPreIter {
85 public:
86  typedef const T& return_t;
87  inline const T& operator*() const { return ((I *)this)->item(); }
88  inline T operator->() const { return ((I *)this)->item(); }
89 };
90 
91 template <class I, class T>
92 class MutPreIter {
93 public:
94  typedef T& return_t;
95  inline T& operator*() const { return ((I *)this)->item(); }
96  inline T operator->() const { return ((I *)this)->item(); }
97 };
98 
99 } // elm
100 
101 #endif /* ELM_ITER_H_ */
Definition: iter.h:84
const T & return_t
Definition: iter.h:86
const T & operator*() const
Definition: iter.h:87
T operator->() const
Definition: iter.h:88
Definition: iter.h:49
void operator++(int)
Definition: iter.h:61
T t
Definition: iter.h:51
const T & return_t
Definition: iter.h:52
const T & operator*() const
Definition: iter.h:57
I & operator++()
Definition: iter.h:60
bool operator!() const
Definition: iter.h:55
const T & operator->() const
Definition: iter.h:58
bool operator==(const I &i) const
Definition: iter.h:63
bool operator()() const
Definition: iter.h:54
bool operator!=(const I &i) const
Definition: iter.h:64
Definition: iter.h:92
T & operator*() const
Definition: iter.h:95
T & return_t
Definition: iter.h:94
T operator->() const
Definition: iter.h:96
Definition: iter.h:69
void operator++(int)
Definition: iter.h:76
T t
Definition: iter.h:71
I & operator++()
Definition: iter.h:75
bool operator!() const
Definition: iter.h:73
bool operator==(const I &i) const
Definition: iter.h:78
bool operator()() const
Definition: iter.h:72
bool operator!=(const I &i) const
Definition: iter.h:79
Definition: iter.h:28
void operator++(int)
Definition: iter.h:40
T operator*() const
Definition: iter.h:36
bool operator!() const
Definition: iter.h:34
T return_t
Definition: iter.h:31
bool operator==(const I &i) const
Definition: iter.h:42
T t
Definition: iter.h:30
I & operator++()
Definition: iter.h:39
bool operator()() const
Definition: iter.h:33
bool operator!=(const I &i) const
Definition: iter.h:43
T operator->() const
Definition: iter.h:37
Definition: adapter.h:26