MorphoGraphX
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MemberIterator.hpp
Go to the documentation of this file.
1 #ifndef MEMBER_ITERATOR_HPP
2 #define MEMBER_ITERATOR_HPP
3 
9 #include <Config.hpp>
10 
11 #include <iterator>
12 
13 namespace mgx {
14 namespace util {
15 template <class Iterator, class Derived> struct BaseIterator {
16  typedef Iterator base_iterator;
20  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
21 
26  : it()
27  {
28  }
29 
33  BaseIterator(const base_iterator& i)
34  : it(i)
35  {
36  }
37 
41  BaseIterator(const BaseIterator& other)
42  : it(other.it)
43  {
44  }
45 
47 
48 
49  bool operator==(const Derived& other) const {
50  return it == other.it;
51  }
52 
53  bool operator!=(const Derived& other) const {
54  return it != other.it;
55  }
56 
60  Derived& operator=(const Derived& copy)
61  {
62  it = copy.it;
63  return static_cast<Derived&>(*this);
64  }
65 
69  Derived& operator++()
70  {
71  ++it;
72  return static_cast<Derived&>(*this);
73  }
77  Derived& operator++(int)
78  {
79  Derived tmp(*this);
80  ++it;
81  return tmp;
82  }
84 
86 
87 
90  Derived& operator--()
91  {
92  --it;
93  return static_cast<Derived&>(*this);
94  }
98  Derived& operator--(int)
99  {
100  Derived tmp(*this);
101  --it;
102  return tmp;
103  }
105 
107 
108 
112  {
113  it += n;
114  return static_cast<Derived&>(*this);
115  }
116 
121  {
122  it -= n;
123  return static_cast<Derived&>(*this);
124  }
125 
126  bool operator<(const Derived& other) const {
127  return it < other.it;
128  }
129 
130  bool operator>(const Derived& other) const {
131  return it > other.it;
132  }
133 
134  bool operator<=(const Derived& other) const {
135  return it <= other.it;
136  }
137 
138  bool operator>=(const Derived& other) const {
139  return it >= other.it;
140  }
142 
144 
145  friend Derived operator+(const Derived& it, difference_type n)
146  {
147  Derived tmp(it);
148  tmp += n;
149  return tmp;
150  }
151 
152  friend Derived operator+(difference_type n, const Derived& it)
153  {
154  Derived tmp(it);
155  tmp += n;
156  return tmp;
157  }
158 
159  friend Derived operator-(const Derived& it, difference_type n)
160  {
161  Derived tmp(it);
162  tmp -= n;
163  return tmp;
164  }
165 
166  friend Derived operator-(difference_type n, const Derived& it)
167  {
168  Derived tmp(it);
169  tmp -= n;
170  return tmp;
171  }
172 
176  friend difference_type operator-(const Derived& last, const Derived& first) {
177  return last.it - first.it;
178  }
180 
184  base_iterator base() const {
185  return it;
186  }
187 
188 protected:
192  base_iterator it;
193 };
194 
229 template <class Iterator, class T, T std::iterator_traits<Iterator>::value_type::*member, class Reference = T&,
230  class Pointer = T*>
232  : public BaseIterator<Iterator, SelectMemberIterator<Iterator, T, member, Reference, Pointer> > {
240  typedef Iterator base_iterator;
244  typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
248  typedef T value_type;
252  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
256  typedef Reference reference;
260  typedef Pointer pointer;
261 
266  }
267 
272  : Super(i)
273  {
274  }
275 
280  : Super(other)
281  {
282  }
283 
288  return (*this->it).*member;
289  }
293  const reference operator*() const {
294  return (*this->it).*member;
295  }
296 
301  return &((*this->it).*member);
302  }
306  const pointer operator->() const {
307  return &((*this->it).*member);
308  }
309 };
310 
311 template <typename T> struct remove_pointer;
312 
313 template <typename T> struct remove_pointer<T*> {
314  typedef T type;
315 };
316 
317 template <class Iterator, class T, T remove_pointer<typename std::iterator_traits<Iterator>::value_type>::type::*member,
318  class Reference = T&, class Pointer = T*>
320  : public BaseIterator<Iterator, SelectMemberPointerIterator<Iterator, T, member, Reference, Pointer> > {
328  typedef Iterator base_iterator;
332  typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
336  typedef T value_type;
340  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
344  typedef Reference reference;
348  typedef Pointer pointer;
349 
354  }
355 
360  : Super(i)
361  {
362  }
363 
368  : Super(other)
369  {
370  }
371 
376  return (**this->it).*member;
377  }
381  const reference operator*() const {
382  return (**this->it).*member;
383  }
384 
389  return &((**this->it).*member);
390  }
394  const pointer operator->() const {
395  return &((**this->it).*member);
396  }
397 };
398 } // namespace util
399 } // namespace mgx
400 #endif
Definition: MemberIterator.hpp:15
Derived & operator--()
Prefix decrement operator.
Definition: MemberIterator.hpp:90
Derived & operator++()
Prefix increment operator.
Definition: MemberIterator.hpp:69
Pointer pointer
Type of a pointer on the values.
Definition: MemberIterator.hpp:348
Definition: MemberIterator.hpp:311
SelectMemberPointerIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:359
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:20
const reference operator*() const
Constant dereference operator.
Definition: MemberIterator.hpp:381
base_iterator base() const
Direct access to the base iterator.
Definition: MemberIterator.hpp:184
Derived & operator++(int)
Postfix increment operator.
Definition: MemberIterator.hpp:77
BaseIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:33
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:252
T value_type
Type of the value iterated on.
Definition: MemberIterator.hpp:336
BaseIterator< Iterator, SelectMemberPointerIterator< Iterator, T, member, Reference, Pointer > > Super
Type of the base class.
Definition: MemberIterator.hpp:324
reference operator*()
Dereference operator.
Definition: MemberIterator.hpp:287
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:340
SelectMemberPointerIterator(const SelectMemberPointerIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:367
Derived & operator--(int)
Postfix decrement operator.
Definition: MemberIterator.hpp:98
T value_type
Type of the value iterated on.
Definition: MemberIterator.hpp:248
Pointer pointer
Type of a pointer on the values.
Definition: MemberIterator.hpp:260
Iterate over a container of structure, dereferencing only a member of it.
Definition: MemberIterator.hpp:231
SelectMemberIterator(const SelectMemberIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:279
const reference operator*() const
Constant dereference operator.
Definition: MemberIterator.hpp:293
Iterator base_iterator
Type of the underlying iterator.
Definition: MemberIterator.hpp:240
SelectMemberPointerIterator()
Default constructor.
Definition: MemberIterator.hpp:353
std::iterator_traits< Iterator >::iterator_category iterator_category
Category of the iterator.
Definition: MemberIterator.hpp:244
Reference reference
Type of a reference on the values.
Definition: MemberIterator.hpp:344
pointer operator->()
Pointer-like arrow operator.
Definition: MemberIterator.hpp:300
Derived & operator-=(difference_type n)
In-place random decrement operator.
Definition: MemberIterator.hpp:120
BaseIterator(const BaseIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:41
SelectMemberIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:271
BaseIterator< Iterator, SelectMemberIterator< Iterator, T, member, Reference, Pointer > > Super
Type of the base class.
Definition: MemberIterator.hpp:236
reference operator*()
Dereference operator.
Definition: MemberIterator.hpp:375
const pointer operator->() const
Pointer-like constant arrow operator.
Definition: MemberIterator.hpp:394
Definition: MemberIterator.hpp:319
friend difference_type operator-(const Derived &last, const Derived &first)
Distance between two iterators.
Definition: MemberIterator.hpp:176
SelectMemberIterator()
Default constructor.
Definition: MemberIterator.hpp:265
Iterator base_iterator
Type of the underlying iterator.
Definition: MemberIterator.hpp:328
std::iterator_traits< Iterator >::iterator_category iterator_category
Category of the iterator.
Definition: MemberIterator.hpp:332
Reference reference
Type of a reference on the values.
Definition: MemberIterator.hpp:256
Derived & operator=(const Derived &copy)
Assignment operator.
Definition: MemberIterator.hpp:60
BaseIterator()
Default constructor.
Definition: MemberIterator.hpp:25
base_iterator it
Underlying iterator.
Definition: MemberIterator.hpp:192
Derived & operator+=(difference_type n)
In-place random increment operator.
Definition: MemberIterator.hpp:111
pointer operator->()
Pointer-like arrow operator.
Definition: MemberIterator.hpp:388
const pointer operator->() const
Pointer-like constant arrow operator.
Definition: MemberIterator.hpp:306