NiHu  2.0
elem_center_iterator.hpp
Go to the documentation of this file.
1 
7 #ifndef NIHU_ELEM_CENTER_ITERATOR_HPP_INCLUDED
8 #define NIHU_ELEM_CENTER_ITERATOR_HPP_INCLUDED
9 
10 #include <iterator>
11 
12 namespace NiHu
13 {
14 namespace fmm
15 {
16 
19 template <class It>
21  : public std::iterator<std::forward_iterator_tag, typename It::value_type::x_t>
22  , private It
23 {
24  typedef typename It::value_type elem_t;
25  typedef typename elem_t::x_t x_t;
26 
27 public:
30  elem_center_iterator(It it = It())
31  : It(it)
32  {
33  }
34 
37  It const &base() const
38  {
39  return static_cast<It const &>(*this);
40  }
41 
44  It &base()
45  {
46  return static_cast<It &>(*this);
47  }
48 
52  ptrdiff_t operator-(elem_center_iterator const &other) const
53  {
54  return base() - other;
55  }
56 
60  elem_center_iterator operator-(ptrdiff_t diff) const
61  {
62  return base() - diff;
63  }
64 
68  elem_center_iterator operator+(ptrdiff_t diff) const
69  {
70  return base() + diff;
71  }
72 
76  {
77  return static_cast<elem_center_iterator &>(++base());
78  }
79 
83  {
84  return base()++;
85  }
86 
89  x_t const &operator*() const
90  {
91  return (*base()).get_center();
92  }
93 
96  x_t const &operator[](size_t idx) const
97  {
98  return base()[idx].get_center();
99  }
100 
103  bool operator != (elem_center_iterator const& other) const
104  {
105  return base() != other;
106  }
107 
110  bool operator == (elem_center_iterator const& other) const
111  {
112  return base() == other;
113  }
114 };
115 
120 template <class It>
122 {
123  return elem_center_iterator<It>(it);
124 }
125 
126 
129 template <class It>
131  : public std::iterator<std::forward_iterator_tag, typename It::value_type::elem_t::x_t>
132  , private It
133 {
134  typedef typename It::value_type field_t;
135  typedef typename field_t::elem_t elem_t;
136  typedef typename elem_t::x_t x_t;
137 
138 public:
141  field_center_iterator(It it = It())
142  : It(it)
143  {
144  }
145 
148  It const &base() const
149  {
150  return *static_cast<It const *>(this);
151  }
152 
155  It &base()
156  {
157  return *static_cast<It *>(this);
158  }
159 
163  ptrdiff_t operator-(field_center_iterator const &other) const
164  {
165  return base() - other;
166  }
167 
171  field_center_iterator operator-(ptrdiff_t diff) const
172  {
173  return base() - diff;
174  }
175 
179  field_center_iterator operator+(ptrdiff_t diff) const
180  {
181  return base() + diff;
182  }
183 
187  {
188  return static_cast<field_center_iterator &>(++base());
189  }
190 
194  {
195  return base()++;
196  }
197 
200  x_t const &operator*() const
201  {
202  return (*base()).get_elem().get_center();
203  }
204 
207  x_t const &operator[](size_t idx) const
208  {
209  return base()[idx].get_elem().get_center();
210  }
211 
214  bool operator != (field_center_iterator const& other) const
215  {
216  return base() != other;
217  }
218 
221  bool operator == (field_center_iterator const& other) const
222  {
223  return base() == other;
224  }
225 };
226 
231 template <class It>
233 {
234  return field_center_iterator<It>(it);
235 }
236 
237 
238 } // end of namespace fmm
239 } // end of namespace NiHu
240 
241 
242 #endif /* NIHU_ELEM_CENTER_ITERATOR_HPP_INCLUDED */
NiHu::fmm::field_center_iterator::base
It & base()
helper function to reach the field iterator interface
Definition: elem_center_iterator.hpp:155
NiHu::fmm::elem_center_iterator::operator*
const x_t & operator*() const
dereference operator
Definition: elem_center_iterator.hpp:89
NiHu::fmm::elem_center_iterator::operator-
ptrdiff_t operator-(elem_center_iterator const &other) const
difference of two iterators
Definition: elem_center_iterator.hpp:52
NiHu::fmm::field_center_iterator::field_center_iterator
field_center_iterator(It it=It())
conversion constructor
Definition: elem_center_iterator.hpp:141
NiHu::fmm::field_center_iterator::operator+
field_center_iterator operator+(ptrdiff_t diff) const
iterator arithmetics
Definition: elem_center_iterator.hpp:179
NiHu::fmm::field_center_iterator::operator*
const x_t & operator*() const
dereference operator
Definition: elem_center_iterator.hpp:200
NiHu::volume_element::x_t
element_traits::location_value_type< Derived, 0 >::type x_t
type of the element's physical location variable
Definition: element.hpp:220
NiHu::fmm::field_center_iterator::base
const It & base() const
helper function to reach the field iterator interface
Definition: elem_center_iterator.hpp:148
NiHu::fmm::elem_center_iterator::operator++
elem_center_iterator operator++(int)
postincrenet operator
Definition: elem_center_iterator.hpp:82
NiHu::fmm::elem_center_iterator::elem_center_iterator
elem_center_iterator(It it=It())
conversion constructor
Definition: elem_center_iterator.hpp:30
NiHu::fmm::elem_center_iterator::base
const It & base() const
helper function to reach the element iterator interface
Definition: elem_center_iterator.hpp:37
NiHu::fmm::field_center_iterator
iterate through field centers
Definition: elem_center_iterator.hpp:130
NiHu::fmm::elem_center_iterator::operator==
bool operator==(elem_center_iterator const &other) const
equality operator
Definition: elem_center_iterator.hpp:110
NiHu::fmm::elem_center_iterator::base
It & base()
helper function to reach the element iterator interface
Definition: elem_center_iterator.hpp:44
NiHu::fmm::field_center_iterator::operator==
bool operator==(field_center_iterator const &other) const
equality operator
Definition: elem_center_iterator.hpp:221
NiHu::fmm::elem_center_iterator::operator[]
const x_t & operator[](size_t idx) const
index operator
Definition: elem_center_iterator.hpp:96
NiHu::fmm::field_center_iterator::operator++
field_center_iterator & operator++()
preincrenet operator
Definition: elem_center_iterator.hpp:186
NiHu::fmm::field_center_iterator::operator[]
const x_t & operator[](size_t idx) const
index operator
Definition: elem_center_iterator.hpp:207
NiHu::fmm::field_center_iterator::operator-
field_center_iterator operator-(ptrdiff_t diff) const
iterator arithmetics
Definition: elem_center_iterator.hpp:171
NiHu::fmm::field_center_iterator::operator++
field_center_iterator operator++(int)
postincrenet operator
Definition: elem_center_iterator.hpp:193
NiHu::fmm::elem_center_iterator::operator++
elem_center_iterator & operator++()
preincrenet operator
Definition: elem_center_iterator.hpp:75
NiHu::fmm::field_center_iterator::operator-
ptrdiff_t operator-(field_center_iterator const &other) const
difference of two iterators
Definition: elem_center_iterator.hpp:163
NiHu::fmm::elem_center_iterator::operator-
elem_center_iterator operator-(ptrdiff_t diff) const
iterator arithmetics
Definition: elem_center_iterator.hpp:60
NiHu::field_view::elem_t
crtp_base_t::elem_t elem_t
the element type shorthand
Definition: field.hpp:351
NiHu::fmm::field_center_iterator::operator!=
bool operator!=(field_center_iterator const &other) const
non-equality operator
Definition: elem_center_iterator.hpp:214
NiHu::fmm::elem_center_iterator::operator+
elem_center_iterator operator+(ptrdiff_t diff) const
iterator arithmetics
Definition: elem_center_iterator.hpp:68
NiHu::fmm::create_field_center_iterator
auto create_field_center_iterator(It it)
factory function to create a field center iterator
Definition: elem_center_iterator.hpp:232
NiHu::fmm::elem_center_iterator::operator!=
bool operator!=(elem_center_iterator const &other) const
non-equality operator
Definition: elem_center_iterator.hpp:103
NiHu::fmm::create_elem_center_iterator
auto create_elem_center_iterator(It it)
factory function to create an element center iterator
Definition: elem_center_iterator.hpp:121
NiHu::fmm::elem_center_iterator
iterate through element centers
Definition: elem_center_iterator.hpp:20