3 #ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
4 #define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
6 #include <dune/common/typelist.hh>
7 #include <dune/common/concept.hh>
17 using namespace Dune::Concept;
31 template<
class... Args>
35 auto require(F&& f) -> decltype(
36 f(std::declval<Args>()...)
46 template<
class F,
class... Args>
56 template<
class F,
class... Args>
65 template<
class Signature>
76 template<
class Range,
class Domain>
77 struct Function<Range(Domain)> : Refines<Callable<Domain> >
80 auto require(F&& f) -> decltype(
82 requireConvertible<Range>(f(std::declval<Domain>()))
87 template<
class F,
class Signature>
89 {
return models<Concept::Function<Signature>, F>(); }
92 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
94 {
return models<Concept::Function<Signature>, F>(); }
113 template<
class Range,
class Domain,
template<
class>
class DerivativeTraits>
114 struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
119 auto require(F&& f) -> decltype(
128 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
131 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
133 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
138 template<
class Signature,
class LocalContext>
150 template<
class Range,
class Domain,
class LocalContext>
152 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
155 auto require(F&& f) -> decltype(
156 f.bind(std::declval<LocalContext>()),
159 requireConvertible<LocalContext>(f.localContext())
164 template<
class F,
class Signature,
class LocalContext>
166 {
return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
170 template<
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
185 template<
class Range,
class Domain,
class LocalContext,
template<
class>
class DerivativeTraits>
188 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
189 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
193 auto require(F&& f) -> decltype(
194 f.bind(std::declval<LocalContext>()),
197 requireConvertible<LocalContext>(f.localContext())
202 template<
class F,
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
204 {
return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
221 auto require(E&& f) -> decltype(
222 requireType<typename E::Element>(),
223 requireType<typename E::LocalCoordinate>(),
224 requireType<typename E::GlobalCoordinate>()
231 {
return models<Concept::EntitySet, E>(); }
236 template<
class Signature,
class EntitySet>
248 template<
class Range,
class Domain,
class EntitySet>
250 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
256 auto require(F&& f) -> decltype(
260 requireConcept<Concept::EntitySet, EntitySet>(),
261 requireConvertible<EntitySet>(f.entitySet()),
262 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
267 template<
class F,
class Signature,
class EntitySet>
269 {
return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
288 template<
class Range,
class Domain,
class EntitySet,
template<
class>
class DerivativeTraits>
291 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
292 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
302 auto require(F&& f) -> decltype(
308 template<
class F,
class Signature,
class EntitySet,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
310 {
return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
315 template<
class Signature,
class Gr
idView>
330 template<
class Range,
class Domain,
class Gr
idView>
332 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
335 auto require(F&& f) -> decltype(
341 template<
class F,
class Signature,
class Gr
idView>
343 {
return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
363 template<
class Range,
class Domain,
class Gr
idView,
template<
class>
class DerivativeTraits>
365 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
368 auto require(F&& f) -> decltype(
374 template<
class F,
class Signature,
class Gr
idView,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
376 {
return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
382 #endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH