MARLEY (Model of Argon Reaction Low Energy Yields) v2.0.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
Loading...
Searching...
No Matches
IteratorToPointerMember.hh
1
4//
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
20namespace 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>
111 IteratorToPointerMember<It, R>::operator++()
112 { ++m_it; return *this; }
113
114 // Prefix operator--
115 template<typename It, typename R>
117 IteratorToPointerMember<It, R>::operator--()
118 { --m_it; return *this; }
119
120 template<typename It, typename R>
122 IteratorToPointerMember<It, R>::operator+=(difference_type n)
123 { m_it += n; return *this; }
124
125 template<typename It, typename R>
127 IteratorToPointerMember<It, R>::operator-=(difference_type n)
128 { m_it -= n; return *this; }
129
130 template<typename It, typename 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>
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>
146 IteratorToPointerMember<It, R>::operator++(int)
147 {
148 auto result = IteratorToPointerMember<It, R>(*this);
149 ++m_it;
150 return result;
151 }
152
154 template<typename It, typename R>
156 IteratorToPointerMember<It, R>::operator--(int)
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...
IteratorToPointerMember(It from, R T::*memptr)
Construction from an iterator and a pointer to member.
std::remove_reference< decltype(*std::declval< T_pointer >())>::type T
Type of the target of the pointer pointed to by the original iterator.
std::iterator_traits< It >::value_type T_pointer
Type of the pointer pointed to by the original iterator.