MorphoGraphX  2.0-1-227
MemberIterator.hpp
Go to the documentation of this file.
1 //
2 // This file is part of MorphoGraphX - http://www.MorphoGraphX.org
3 // Copyright (C) 2012-2015 Richard S. Smith and collaborators.
4 //
5 // If you use MorphoGraphX in your work, please cite:
6 // http://dx.doi.org/10.7554/eLife.05864
7 //
8 // MorphoGraphX is free software, and is licensed under under the terms of the
9 // GNU General (GPL) Public License version 2.0, http://www.gnu.org/licenses.
10 //
11 #ifndef MEMBER_ITERATOR_HPP
12 #define MEMBER_ITERATOR_HPP
13 
19 #include <Config.hpp>
20 
21 #include <iterator>
22 
23 namespace mgx
24 {
25  template <class Iterator, class Derived> struct BaseIterator
26  {
27  typedef Iterator base_iterator;
31  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
32 
36  BaseIterator() : it() {}
37 
41  BaseIterator(const base_iterator& i) : it(i) {}
42 
46  BaseIterator(const BaseIterator& other) : it(other.it) {}
47 
49 
50 
51  bool operator==(const Derived& other) const { return it == other.it; }
52 
53  bool operator!=(const Derived& other) const { return it != other.it; }
54 
58  Derived& operator=(const Derived& copy)
59  {
60  it = copy.it;
61  return static_cast<Derived&>(*this);
62  }
63 
67  Derived& operator++()
68  {
69  ++it;
70  return static_cast<Derived&>(*this);
71  }
75  Derived& operator++(int)
76  {
77  Derived tmp(*this);
78  ++it;
79  return tmp;
80  }
82 
84 
85 
88  Derived& operator--()
89  {
90  --it;
91  return static_cast<Derived&>(*this);
92  }
96  Derived& operator--(int)
97  {
98  Derived tmp(*this);
99  --it;
100  return tmp;
101  }
103 
105 
106 
110  {
111  it += n;
112  return static_cast<Derived&>(*this);
113  }
114 
119  {
120  it -= n;
121  return static_cast<Derived&>(*this);
122  }
123 
124  bool operator<(const Derived& other) const {
125  return it < other.it;
126  }
127 
128  bool operator>(const Derived& other) const {
129  return it > other.it;
130  }
131 
132  bool operator<=(const Derived& other) const {
133  return it <= other.it;
134  }
135 
136  bool operator>=(const Derived& other) const {
137  return it >= other.it;
138  }
140 
142 
143  friend Derived operator+(const Derived& it, difference_type n)
144  {
145  Derived tmp(it);
146  tmp += n;
147  return tmp;
148  }
149 
150  friend Derived operator+(difference_type n, const Derived& it)
151  {
152  Derived tmp(it);
153  tmp += n;
154  return tmp;
155  }
156 
157  friend Derived operator-(const Derived& it, difference_type n)
158  {
159  Derived tmp(it);
160  tmp -= n;
161  return tmp;
162  }
163 
164  friend Derived operator-(difference_type n, const Derived& it)
165  {
166  Derived tmp(it);
167  tmp -= n;
168  return tmp;
169  }
170 
174  friend difference_type operator-(const Derived& last, const Derived& first) {
175  return last.it - first.it;
176  }
178 
182  base_iterator base() const {
183  return it;
184  }
185 
186  protected:
191  };
192 
227  template <class Iterator, class T, T std::iterator_traits<Iterator>::value_type::*member, class Reference = T&,
228  class Pointer = T*>
230  : public BaseIterator<Iterator, SelectMemberIterator<Iterator, T, member, Reference, Pointer> > {
238  typedef Iterator base_iterator;
242  typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
246  typedef T value_type;
250  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
254  typedef Reference reference;
258  typedef Pointer pointer;
259 
264  }
265 
270  : Super(i)
271  {
272  }
273 
278  : Super(other)
279  {
280  }
281 
286  return (*this->it).*member;
287  }
291  const reference operator*() const {
292  return (*this->it).*member;
293  }
294 
299  return &((*this->it).*member);
300  }
304  const pointer operator->() const {
305  return &((*this->it).*member);
306  }
307  };
308 
309  template <typename T> struct remove_pointer;
310 
311  template <typename T> struct remove_pointer<T*> {
312  typedef T type;
313  };
314 
315  template <class Iterator, class T, T remove_pointer<typename std::iterator_traits<Iterator>::value_type>::type::*member,
316  class Reference = T&, class Pointer = T*>
318  : public BaseIterator<Iterator, SelectMemberPointerIterator<Iterator, T, member, Reference, Pointer> > {
326  typedef Iterator base_iterator;
330  typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
334  typedef T value_type;
338  typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
342  typedef Reference reference;
346  typedef Pointer pointer;
347 
352  }
353 
358  : Super(i)
359  {
360  }
361 
366  : Super(other)
367  {
368  }
369 
374  return (**this->it).*member;
375  }
379  const reference operator*() const {
380  return (**this->it).*member;
381  }
382 
387  return &((**this->it).*member);
388  }
392  const pointer operator->() const {
393  return &((**this->it).*member);
394  }
395  };
396 }
397 #endif
mgx::SelectMemberIterator::SelectMemberIterator
SelectMemberIterator()
Default constructor.
Definition: MemberIterator.hpp:263
mgx::BaseIterator::operator-
friend Derived operator-(const Derived &it, difference_type n)
Definition: MemberIterator.hpp:157
mgx::SelectMemberIterator::difference_type
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:250
mgx::BaseIterator::BaseIterator
BaseIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:41
mgx::SelectMemberPointerIterator::operator->
const pointer operator->() const
Pointer-like constant arrow operator.
Definition: MemberIterator.hpp:392
mgx::BaseIterator::operator-
friend difference_type operator-(const Derived &last, const Derived &first)
Distance between two iterators.
Definition: MemberIterator.hpp:174
mgx::SelectMemberPointerIterator::operator*
reference operator*()
Dereference operator.
Definition: MemberIterator.hpp:373
mgx::SelectMemberIterator::operator*
reference operator*()
Dereference operator.
Definition: MemberIterator.hpp:285
mgx::SelectMemberIterator::Super
BaseIterator< Iterator, SelectMemberIterator< Iterator, T, member, Reference, Pointer > > Super
Type of the base class.
Definition: MemberIterator.hpp:234
mgx::BaseIterator::operator>=
bool operator>=(const Derived &other) const
Definition: MemberIterator.hpp:136
mgx::SelectMemberPointerIterator::SelectMemberPointerIterator
SelectMemberPointerIterator(const SelectMemberPointerIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:365
mgx::BaseIterator::operator=
Derived & operator=(const Derived &copy)
Assignment operator.
Definition: MemberIterator.hpp:58
mgx::BaseIterator::it
base_iterator it
Underlying iterator.
Definition: MemberIterator.hpp:190
n
#define n
Definition: Eigenvalues.hpp:36
mgx::BaseIterator::operator==
bool operator==(const Derived &other) const
Definition: MemberIterator.hpp:51
mgx::SelectMemberPointerIterator::operator->
pointer operator->()
Pointer-like arrow operator.
Definition: MemberIterator.hpp:386
mgx::BaseIterator::operator++
Derived & operator++(int)
Postfix increment operator.
Definition: MemberIterator.hpp:75
mgx::BaseIterator::base_iterator
Iterator base_iterator
Definition: MemberIterator.hpp:27
mgx::BaseIterator::operator--
Derived & operator--()
Prefix decrement operator.
Definition: MemberIterator.hpp:88
mgx::SelectMemberPointerIterator::iterator_category
std::iterator_traits< Iterator >::iterator_category iterator_category
Category of the iterator.
Definition: MemberIterator.hpp:330
mgx::SelectMemberIterator::SelectMemberIterator
SelectMemberIterator(const SelectMemberIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:277
mgx::BaseIterator::base
base_iterator base() const
Direct access to the base iterator.
Definition: MemberIterator.hpp:182
mgx::SelectMemberPointerIterator::pointer
Pointer pointer
Type of a pointer on the values.
Definition: MemberIterator.hpp:346
mgx::BaseIterator::operator!=
bool operator!=(const Derived &other) const
Definition: MemberIterator.hpp:53
mgx::SelectMemberPointerIterator::operator*
const reference operator*() const
Constant dereference operator.
Definition: MemberIterator.hpp:379
mgx::SelectMemberIterator::operator->
pointer operator->()
Pointer-like arrow operator.
Definition: MemberIterator.hpp:298
mgx
Distributed matrix library.
Definition: Assert.hpp:26
mgx::SelectMemberIterator
Iterate over a container of structure, dereferencing only a member of it.
Definition: MemberIterator.hpp:229
mgx::SelectMemberIterator::iterator_category
std::iterator_traits< Iterator >::iterator_category iterator_category
Category of the iterator.
Definition: MemberIterator.hpp:242
mgx::SelectMemberPointerIterator
Definition: MemberIterator.hpp:317
mgx::remove_pointer< T * >::type
T type
Definition: MemberIterator.hpp:312
mgx::BaseIterator::operator<
bool operator<(const Derived &other) const
Definition: MemberIterator.hpp:124
mgx::BaseIterator::operator--
Derived & operator--(int)
Postfix decrement operator.
Definition: MemberIterator.hpp:96
mgx::BaseIterator::operator<=
bool operator<=(const Derived &other) const
Definition: MemberIterator.hpp:132
mgx::SelectMemberPointerIterator::reference
Reference reference
Type of a reference on the values.
Definition: MemberIterator.hpp:342
mgx::SelectMemberIterator::reference
Reference reference
Type of a reference on the values.
Definition: MemberIterator.hpp:254
mgx::SelectMemberPointerIterator::Super
BaseIterator< Iterator, SelectMemberPointerIterator< Iterator, T, member, Reference, Pointer > > Super
Type of the base class.
Definition: MemberIterator.hpp:322
mgx::BaseIterator::difference_type
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:31
mgx::SelectMemberPointerIterator::SelectMemberPointerIterator
SelectMemberPointerIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:357
mgx::SelectMemberIterator::operator*
const reference operator*() const
Constant dereference operator.
Definition: MemberIterator.hpp:291
mgx::BaseIterator::operator+=
Derived & operator+=(difference_type n)
In-place random increment operator.
Definition: MemberIterator.hpp:109
mgx::SelectMemberIterator::operator->
const pointer operator->() const
Pointer-like constant arrow operator.
Definition: MemberIterator.hpp:304
mgx::SelectMemberIterator::base_iterator
Iterator base_iterator
Type of the underlying iterator.
Definition: MemberIterator.hpp:238
mgx::BaseIterator::BaseIterator
BaseIterator()
Default constructor.
Definition: MemberIterator.hpp:36
mgx::SelectMemberIterator::value_type
T value_type
Type of the value iterated on.
Definition: MemberIterator.hpp:246
mgx::remove_pointer
Definition: MemberIterator.hpp:309
mgx::SelectMemberIterator::SelectMemberIterator
SelectMemberIterator(const base_iterator &i)
Conversion from the base iterator.
Definition: MemberIterator.hpp:269
mgx::BaseIterator::operator+
friend Derived operator+(const Derived &it, difference_type n)
Definition: MemberIterator.hpp:143
mgx::SelectMemberPointerIterator::SelectMemberPointerIterator
SelectMemberPointerIterator()
Default constructor.
Definition: MemberIterator.hpp:351
mgx::BaseIterator
Definition: MemberIterator.hpp:25
mgx::BaseIterator::operator-
friend Derived operator-(difference_type n, const Derived &it)
Definition: MemberIterator.hpp:164
mgx::BaseIterator::operator++
Derived & operator++()
Prefix increment operator.
Definition: MemberIterator.hpp:67
mgx::BaseIterator::operator+
friend Derived operator+(difference_type n, const Derived &it)
Definition: MemberIterator.hpp:150
mgx::SelectMemberPointerIterator::difference_type
std::iterator_traits< Iterator >::difference_type difference_type
Type of the difference between two iterators.
Definition: MemberIterator.hpp:338
mgx::BaseIterator::operator-=
Derived & operator-=(difference_type n)
In-place random decrement operator.
Definition: MemberIterator.hpp:118
mgx::BaseIterator::operator>
bool operator>(const Derived &other) const
Definition: MemberIterator.hpp:128
mgx::SelectMemberPointerIterator::value_type
T value_type
Type of the value iterated on.
Definition: MemberIterator.hpp:334
mgx::SelectMemberPointerIterator::base_iterator
Iterator base_iterator
Type of the underlying iterator.
Definition: MemberIterator.hpp:326
mgx::BaseIterator::BaseIterator
BaseIterator(const BaseIterator &other)
Copy constructor.
Definition: MemberIterator.hpp:46
mgx::SelectMemberIterator::pointer
Pointer pointer
Type of a pointer on the values.
Definition: MemberIterator.hpp:258