3 #ifndef DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
4 #define DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
9 #include <dune/common/nullptr.hh>
10 #include <dune/common/tuples.hh>
21 template<
typename T,
bool is_const,
typename Tag,
typename... Iterators>
24 template<
typename T,
typename... Iterators>
28 typename tags::container<typename T::block_type>::type::base_tag,
29 Iterators..., typename T::const_iterator
33 template<
typename T,
typename... Iterators>
37 typename tags::container<typename T::block_type>::type::base_tag,
38 Iterators..., typename T::iterator
42 template<
typename T,
typename... Iterators>
45 typedef tuple<Iterators...,
typename T::const_iterator>
type;
48 template<
typename T,
typename... Iterators>
51 typedef tuple<Iterators...,
typename T::iterator>
type;
55 template<
typename T,
typename... Iterators>
58 typedef tuple<Iterators...,
typename T::const_iterator>
type;
61 template<
typename T,
typename... Iterators>
64 typedef tuple<Iterators...,
typename T::iterator>
type;
81 :
public std::iterator<std::forward_iterator_tag,
82 typename V::field_type,
83 typename std::ptrdiff_t,
84 typename V::field_type*,
85 typename V::field_type&
91 static const bool is_const =
false;
96 :
public std::iterator<std::forward_iterator_tag,
97 typename V::field_type,
98 typename std::ptrdiff_t,
99 const typename V::field_type*,
100 const typename V::field_type&
106 static const bool is_const =
true;
133 if (!start(vector_tag(),level<0>(),vector))
144 , _current(r._current)
145 , _iterators(r._iterators)
161 _current =r._current;
162 _iterators = r._iterators;
195 is_same<vector,typename vector_iterator<W>::vector>
::value,
204 return _current == r._current;
212 is_same<vector,typename vector_iterator<W>::vector>
::value,
222 template<std::
size_t l>
224 :
public integral_constant<std::size_t,l>
230 if (!advance(vector_tag(),level<0>()))
234 template<std::
size_t l,
typename Block>
235 bool start_leaf(level<l>, Block& block)
237 typedef typename tuple_element<l,Iterators>::type iterator;
238 iterator& it = get<l>(_iterators);
239 iterator& end = get<l>(_end);
252 template<std::
size_t l,
typename Block>
253 bool start(tags::field_vector_n, level<l>, Block& block)
255 return start_leaf(level<l>(),block);
258 template<std::
size_t l,
typename Block>
259 bool start(tags::dynamic_vector, level<l>, Block& block)
261 return start_leaf(level<l>(),block);
264 template<std::
size_t l,
typename Block>
265 bool start(tags::field_vector_1, level<l>, Block& block)
267 _current = &(block[0]);
272 template<std::
size_t l,
typename Block>
273 bool start(tags::block_vector, level<l>, Block& block)
275 typedef typename tuple_element<l,Iterators>::type iterator;
276 iterator& it = get<l>(_iterators);
277 iterator& end = get<l>(_end);
294 template<std::
size_t l>
295 bool advance_leaf(level<l>)
297 typedef typename tuple_element<l,Iterators>::type iterator;
298 iterator& it = get<l>(_iterators);
299 const iterator& end = get<l>(_end);
311 template<std::
size_t l>
312 bool advance(tags::field_vector_n, level<l>)
314 return advance_leaf(level<l>());
317 template<std::
size_t l>
318 bool advance(tags::dynamic_vector, level<l>)
320 return advance_leaf(level<l>());
323 template<std::
size_t l>
324 bool advance(tags::field_vector_1, level<l>)
330 template<std::
size_t l>
331 bool advance(tags::block_vector, level<l>)
333 typedef typename tuple_element<l,Iterators>::type iterator;
334 iterator& it = get<l>(_iterators);
335 iterator& end = get<l>(_end);
355 typename BaseT::pointer _current;
356 Iterators _iterators;
367 #endif // DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
Definition: vectoriterator.hh:22
tags::container< T >::type container_tag(const T &)
Gets instance of container tag associated with T.
Definition: backend/istl/tags.hh:246
V & vector_reference
Definition: vectoriterator.hh:89
V vector
Definition: vectoriterator.hh:88
vector_iterator(const vector_iterator< W > &r, typename enable_if< is_const &&!is_same< V, W >::value &&is_same< vector, W >::value, void * >::type=nullptr)
Definition: vectoriterator.hh:142
vector_iterator operator++(int)
Definition: vectoriterator.hh:186
static const unsigned int value
Definition: gridfunctionspace/tags.hh:175
vector_iterator & operator++()
Definition: vectoriterator.hh:180
BaseT::pointer operator->() const
Definition: vectoriterator.hh:168
vector_iterator(vector_reference vector, bool at_end)
Definition: vectoriterator.hh:128
Definition: vectoriterator.hh:80
tuple< Iterators..., typename T::const_iterator > type
Definition: vectoriterator.hh:58
tuple< Iterators..., typename T::iterator > type
Definition: vectoriterator.hh:64
tuple< Iterators..., typename T::const_iterator > type
Definition: vectoriterator.hh:45
tags::container< V >::type::base_tag vector_tag
Definition: vectoriterator.hh:90
const V & vector_reference
Definition: vectoriterator.hh:104
static const bool is_const
Definition: vectoriterator.hh:91
Definition: adaptivity.hh:27
BaseT::reference operator*() const
Definition: vectoriterator.hh:174
tuple< Iterators..., typename T::iterator > type
Definition: vectoriterator.hh:51
Definition: vectoriterator.hh:112
enable_if< is_same< vector, typename vector_iterator< W >::vector >::value, bool >::type operator!=(const vector_iterator< W > &r) const
Definition: vectoriterator.hh:215
tags::container< V >::type::base_tag vector_tag
Definition: vectoriterator.hh:105
enable_if< is_const &&!is_same< vector, W >::value &&is_same< vector, W >::value, vector_iterator & >::type operator=(const vector_iterator< W > &r)
Definition: vectoriterator.hh:158
enable_if< is_same< vector, typename vector_iterator< W >::vector >::value, bool >::type operator==(const vector_iterator< W > &r) const
Definition: vectoriterator.hh:198
V vector
Definition: vectoriterator.hh:103
Extracts the container tag from T.
Definition: backend/istl/tags.hh:142
Definition: vectoriterator.hh:69