3 #ifndef DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
4 #define DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
9 #include <dune/common/static_assert.hh>
10 #include <dune/common/nullptr.hh>
11 #include <dune/common/tuples.hh>
14 #if !HAVE_VARIADIC_TEMPLATES
15 #include <dune/common/tupleutility.hh>
26 #if HAVE_VARIADIC_TEMPLATES
28 template<
typename T,
bool is_const,
typename Tag,
typename... Iterators>
31 template<
typename T,
typename... Iterators>
35 typename tags::container<typename T::block_type>::type::base_tag,
36 Iterators..., typename T::const_iterator
40 template<
typename T,
typename... Iterators>
44 typename tags::container<typename T::block_type>::type::base_tag,
45 Iterators..., typename T::iterator
49 template<
typename T,
typename... Iterators>
52 typedef tuple<Iterators...,
typename T::const_iterator> type;
55 template<
typename T,
typename... Iterators>
58 typedef tuple<Iterators...,
typename T::iterator> type;
62 template<
typename T,
typename... Iterators>
65 typedef tuple<Iterators...,
typename T::const_iterator> type;
68 template<
typename T,
typename... Iterators>
71 typedef tuple<Iterators...,
typename T::iterator> type;
86 #else // HAVE_VARIADIC_TEMPLATES
89 template<
typename T,
bool is_const,
typename Tag,
typename Iterators>
92 template<
typename T,
typename Iterators>
96 typename tags::container<typename T::block_type>::type::base_tag,
97 typename PushBackTuple<Iterators,typename T::const_iterator>::type
101 template<
typename T,
typename Iterators>
105 typename tags::container<typename T::block_type>::type::base_tag,
106 typename PushBackTuple<Iterators,typename T::iterator>::type
110 template<
typename T,
typename Iterators>
113 typedef typename PushBackTuple<Iterators,typename T::const_iterator>::type
type;
116 template<
typename T,
typename Iterators>
119 typedef typename PushBackTuple<Iterators,typename T::iterator>::type
type;
123 template<
typename T,
typename Iterators>
126 typedef typename PushBackTuple<Iterators,typename T::const_iterator>::type
type;
129 template<
typename T,
typename Iterators>
132 typedef typename PushBackTuple<Iterators,typename T::iterator>::type
type;
138 :
public _extract_iterators<V,false,typename tags::container<V>::type::base_tag,tuple<> >
143 :
public _extract_iterators<V,true,typename tags::container<V>::type::base_tag,tuple<> >
147 #endif // HAVE_VARIADIC_TEMPLATES
151 :
public std::iterator<std::forward_iterator_tag,
152 typename V::field_type,
153 typename std::ptrdiff_t,
154 typename V::field_type*,
155 typename V::field_type&
166 :
public std::iterator<std::forward_iterator_tag,
167 typename V::field_type,
168 typename std::ptrdiff_t,
169 const typename V::field_type*,
170 const typename V::field_type&
214 , _current(r._current)
215 , _iterators(r._iterators)
231 _current =r._current;
232 _iterators = r._iterators;
265 is_same<vector,typename vector_iterator<W>::vector>
::value,
274 return _current == r._current;
282 is_same<vector,typename vector_iterator<W>::vector>
::value,
292 template<std::
size_t l>
294 :
public integral_constant<std::size_t,l>
300 if (!advance(vector_tag(),level<0>()))
304 template<std::
size_t l,
typename Block>
305 bool start_leaf(level<l>, Block& block)
307 typedef typename tuple_element<l,Iterators>::type iterator;
308 iterator& it = get<l>(_iterators);
309 iterator& end = get<l>(_end);
322 template<std::
size_t l,
typename Block>
323 bool start(tags::field_vector_n, level<l>, Block& block)
325 return start_leaf(level<l>(),block);
328 template<std::
size_t l,
typename Block>
329 bool start(tags::dynamic_vector, level<l>, Block& block)
331 return start_leaf(level<l>(),block);
334 template<std::
size_t l,
typename Block>
335 bool start(tags::field_vector_1, level<l>, Block& block)
337 _current = &(block[0]);
342 template<std::
size_t l,
typename Block>
343 bool start(tags::block_vector, level<l>, Block& block)
345 typedef typename tuple_element<l,Iterators>::type iterator;
346 iterator& it = get<l>(_iterators);
347 iterator& end = get<l>(_end);
364 template<std::
size_t l>
365 bool advance_leaf(level<l>)
367 typedef typename tuple_element<l,Iterators>::type iterator;
368 iterator& it = get<l>(_iterators);
369 const iterator& end = get<l>(_end);
381 template<std::
size_t l>
382 bool advance(tags::field_vector_n, level<l>)
384 return advance_leaf(level<l>());
387 template<std::
size_t l>
388 bool advance(tags::dynamic_vector, level<l>)
390 return advance_leaf(level<l>());
393 template<std::
size_t l>
394 bool advance(tags::field_vector_1, level<l>)
400 template<std::
size_t l>
401 bool advance(tags::block_vector, level<l>)
403 typedef typename tuple_element<l,Iterators>::type iterator;
404 iterator& it = get<l>(_iterators);
405 iterator& end = get<l>(_end);
425 typename BaseT::pointer _current;
426 Iterators _iterators;
437 #endif // DUNE_PDELAB_BACKEND_ISTL_VECTORITERATOR_HH
Extracts the container tag from T.
Definition: backend/istl/tags.hh:143
Definition: vectoriterator.hh:90
PushBackTuple< Iterators, typename T::const_iterator >::type type
Definition: vectoriterator.hh:126
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:212
PushBackTuple< Iterators, typename T::iterator >::type type
Definition: vectoriterator.hh:132
vector_iterator(vector_reference vector, bool at_end)
Definition: vectoriterator.hh:198
static const bool is_const
Definition: vectoriterator.hh:161
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:228
V vector
Definition: vectoriterator.hh:158
Definition: vectoriterator.hh:150
tags::container< V >::type::base_tag vector_tag
Definition: vectoriterator.hh:160
Definition: vectoriterator.hh:137
static const unsigned int value
Definition: gridfunctionspace/tags.hh:175
vector_iterator operator++(int)
Definition: vectoriterator.hh:256
enable_if< is_same< vector, typename vector_iterator< W >::vector >::value, bool >::type operator==(const vector_iterator< W > &r) const
Definition: vectoriterator.hh:268
PushBackTuple< Iterators, typename T::iterator >::type type
Definition: vectoriterator.hh:119
V vector
Definition: vectoriterator.hh:173
enable_if< is_same< vector, typename vector_iterator< W >::vector >::value, bool >::type operator!=(const vector_iterator< W > &r) const
Definition: vectoriterator.hh:285
const V & vector_reference
Definition: vectoriterator.hh:174
tags::container< V >::type::base_tag vector_tag
Definition: vectoriterator.hh:175
V & vector_reference
Definition: vectoriterator.hh:159
BaseT::reference operator*() const
Definition: vectoriterator.hh:244
tags::container< T >::type container_tag(const T &)
Gets instance of container tag associated with T.
Definition: backend/istl/tags.hh:247
Definition: vectoriterator.hh:182
BaseT::pointer operator->() const
Definition: vectoriterator.hh:238
vector_iterator & operator++()
Definition: vectoriterator.hh:250
PushBackTuple< Iterators, typename T::const_iterator >::type type
Definition: vectoriterator.hh:113