MARLEY (Model of Argon Reaction Low Energy Yields)  v1.2.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
IteratorToPointerMember.hh
1 //
5 // This file is part of MARLEY (Model of Argon Reaction Low Energy Yields)
6 //
7 // MARLEY is free software: you can redistribute it and/or modify it under the
8 // terms of version 3 of the GNU General Public License as published by the
9 // Free Software Foundation.
10 //
11 // For the full text of the license please see COPYING or
12 // visit http://opensource.org/licenses/GPL-3.0
13 //
14 // Please respect the MCnet academic usage guidelines. See GUIDELINES
15 // or visit https://www.montecarlonet.org/GUIDELINES for details.
16 
17 #pragma once
18 #include <iterator>
19 
20 namespace marley {
21 
30  template< typename It, typename R > class IteratorToPointerMember
31  {
32 
33  public:
34 
35  // Some typedefs
37  typedef typename std::iterator_traits<It>::value_type
43  typedef typename std::remove_reference<
44  decltype( *std::declval<T_pointer>() ) >::type T;
45  typedef typename std::iterator_traits<It>::iterator_category
46  iterator_category;
47  typedef typename std::iterator_traits<It>::difference_type
48  difference_type;
49  typedef R value_type;
50  typedef R* pointer;
51  typedef R& reference;
52 
56  IteratorToPointerMember(It from, R T::* memptr) :
57  m_it(from), m_memptr(memptr){}
58 
59  // Operators *, ->, and [] are first forwarded to the contained
60  // iterator, then extract the data member.
61  virtual reference operator*() const;
62  virtual pointer operator->() const;
63  reference operator[](difference_type n) const;
64 
65  // All operators that have to do with position are forwarded
66  // to the contained iterator.
67  IteratorToPointerMember& operator++();
68  IteratorToPointerMember operator++(int);
69  IteratorToPointerMember& operator--();
70  IteratorToPointerMember operator--(int);
71  IteratorToPointerMember& operator+=(difference_type n);
72  IteratorToPointerMember operator+(difference_type n) const;
73  IteratorToPointerMember& operator-=(difference_type n);
74  IteratorToPointerMember operator-(difference_type n) const;
75 
76  inline difference_type
77  operator-(const IteratorToPointerMember<It, R>& rhs) const
78  { return m_it - rhs.m_it; }
79 
80  bool operator==(const IteratorToPointerMember<It, R>& rhs) const
81  { return m_it == rhs.m_it; }
82  bool operator!=(const IteratorToPointerMember<It, R>& rhs) const
83  { return m_it != rhs.m_it; }
84 
85  It m_it;
86 
87  protected:
88  value_type T::* m_memptr;
89 
90  };
91 
92  // Member function operators
93  template<typename It, typename R>
94  inline typename IteratorToPointerMember<It, R>::reference
95  IteratorToPointerMember<It, R>::operator*() const
96  { return (**m_it).*m_memptr; }
97 
98  template<typename It, typename R>
99  inline typename IteratorToPointerMember<It, R>::pointer
100  IteratorToPointerMember<It, R>::operator->() const
101  { return &((**m_it).*m_memptr); }
102 
103  template<typename It, typename R>
104  inline typename IteratorToPointerMember<It, R>::reference
105  IteratorToPointerMember<It, R>::operator[](difference_type n) const
106  { return m_it[n].*m_memptr; }
107 
108  // Prefix operator++
109  template<typename It, typename R>
110  inline IteratorToPointerMember<It, R>&
111  IteratorToPointerMember<It, R>::operator++()
112  { ++m_it; return *this; }
113 
114  // Prefix operator--
115  template<typename It, typename R>
116  inline IteratorToPointerMember<It, R>&
117  IteratorToPointerMember<It, R>::operator--()
118  { --m_it; return *this; }
119 
120  template<typename It, typename R>
121  inline IteratorToPointerMember<It, R>&
122  IteratorToPointerMember<It, R>::operator+=(difference_type n)
123  { m_it += n; return *this; }
124 
125  template<typename It, typename R>
126  inline IteratorToPointerMember<It, R>&
127  IteratorToPointerMember<It, R>::operator-=(difference_type n)
128  { m_it -= n; return *this; }
129 
130  template<typename It, typename R>
131  inline IteratorToPointerMember<It, R>
132  IteratorToPointerMember<It, R>::operator+(difference_type n) const
133  { return IteratorToPointerMember<It, R>(m_it + n, m_memptr); }
134 
135  template<typename It, typename R>
136  inline IteratorToPointerMember<It, R>
137  IteratorToPointerMember<It, R>::operator-(difference_type n) const
138  { return IteratorToPointerMember<It, R>(m_it - n, m_memptr); }
139 
144  template<typename It, typename R>
145  inline IteratorToPointerMember<It, R>
147  {
148  auto result = IteratorToPointerMember<It, R>(*this);
149  ++m_it;
150  return result;
151  }
152 
154  template<typename It, typename R>
157  {
158  auto result = IteratorToPointerMember<It, R>(*this);
159  --m_it;
160  return result;
161  }
162 
164  template<typename It, typename R>
166  make_IteratorToPointerMember(It it, R std::iterator_traits<It>
167  ::value_type::* memptr)
168  { return IteratorToPointerMember<It, R>(it, memptr); }
169 }
Template class that creates an iterator to a class member based on an iterator to a pointer (either b...
Definition: IteratorToPointerMember.hh:31
IteratorToPointerMember(It from, R T::*memptr)
Construction from an iterator and a pointer to member.
Definition: IteratorToPointerMember.hh:56
std::remove_reference< decltype(*std::declval< T_pointer >)) >::type T
Type of the target of the pointer pointed to by the original iterator.
Definition: IteratorToPointerMember.hh:44
std::iterator_traits< It >::value_type T_pointer
Type of the pointer pointed to by the original iterator.
Definition: IteratorToPointerMember.hh:38