3 #ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH 4 #define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH 7 #include <dune/common/concept.hh> 8 #include <dune/common/hybridutilities.hh> 19 template<
class size_type>
20 struct HasDynamicIndexAccess
23 auto require(C&& c) -> decltype(
24 c[std::declval<size_type>()]
46 template<
class C,
class I,
class F,
47 typename std::enable_if< Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(),
int>::type = 0>
71 template<
class C,
class I,
class F,
72 typename std::enable_if< not Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(),
int>::type = 0>
75 using Size = decltype(Hybrid::size(c));
76 return Hybrid::switchCases(std::make_index_sequence<Size::value>(), i,
77 [&](
const auto& ii) -> decltype(
auto){
79 }, [&]() -> decltype(
auto){
80 return f(c[Dune::Indices::_0]);
99 template<
class Index, std::
size_t offset=1>
108 decltype(
auto) operator[](const P& position)
const 110 return index_[position+offset];
123 return index_.size() - offset;
137 template<std::
size_t offset,
class Index>
150 template<
class Index>
160 template<
class Result,
class Index>
161 struct MultiIndexResolver
163 MultiIndexResolver(
const Index& index) :
168 typename std::enable_if<not std::is_convertible<C&, Result>::value,
int>::type = 0>
169 Result operator()(C&& c)
172 auto&& subIndexResolver = MultiIndexResolver<Result, decltype(subIndex)>(subIndex);
173 return (Result)(
hybridIndexAccess(c, index_[Dune::Indices::_0], subIndexResolver));
177 typename std::enable_if<std::is_convertible<C&, Result>::value,
int>::type = 0>
178 Result operator()(C&& c)
180 return (Result)(std::forward<C>(c));
208 template<
class Result,
class C,
class MultiIndex>
212 Imp::MultiIndexResolver<Result, MultiIndex> multiIndexResolver(index);
213 return multiIndexResolver(c);
223 #endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH ShiftedMultiIndex< Index, offset > shiftedMultiIndex(const Index &index)
Create a ShiftedMultiIndex.
Definition: indexaccess.hh:138
ShiftedMultiIndex(const Index &index)
Definition: indexaccess.hh:103
Class representing a shifted multi index.
Definition: indexaccess.hh:100
auto size() const
Definition: indexaccess.hh:121
ShiftedMultiIndex< Index, offset+1 > pop() const
Return multi index with one more position truncated.
Definition: indexaccess.hh:116
Definition: polynomial.hh:7
Result hybridMultiIndexAccess(C &&c, const MultiIndex &index)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:209
auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i]))
Provide operator[] index-access for containers.
Definition: indexaccess.hh:48