3 #ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH 4 #define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH 9 #include <dune/common/hybridutilities.hh> 10 #include <dune/common/std/apply.hh> 11 #include <dune/common/std/type_traits.hh> 30 struct yes { std::size_t dummy[2]; };
31 struct no { std::size_t dummy[1]; };
34 static yes test(
const decltype(&C::operator()) *);
38 enum { value = (
sizeof(test<F>(0)) ==
sizeof(yes)) };
41 template<
typename R,
typename D>
44 enum { value =
true };
47 template<
typename R,
typename D>
50 enum { value =
true };
59 template<class Signature, bool isCallable = IsCallable<Signature>::value >
70 template <
typename C,
typename R,
typename D>
76 template <
typename C,
typename R,
typename D>
82 template <
typename R,
typename D>
88 template<
class R,
class D>
94 using RawRange =
typename std::decay<Range>::type;
95 using RawDomain =
typename std::decay<Domain>::type;
97 using RawSignature = RawRange(RawDomain);
100 using DerivativeSignature =
typename DerivativeTraits<RawSignature>::Range(Domain);
117 template<
class Range,
class Domain,
template<
class>
class DerivativeTraitsT>
139 using DerivativeRange =
typename DerivativeTraits<Range(Domain)>::Range;
158 template<std::
size_t maxOrder,
class Signature,
template<
class>
class DerivativeTraits>
164 return Hybrid::ifElse(Std::bool_constant<maxOrder==0>(), [&](
auto id) {
166 return std::make_tuple(tag);
173 return Std::apply([&](
auto&&... tailTags){
174 return std::make_tuple(tag, tailTags...);
184 #endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH Helper class to deduce the signature of a callable.
Definition: signature.hh:60
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:36
Helper class to check that F is callable.
Definition: signature.hh:24
Range(Domain) Signature
Definition: signature.hh:120
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition: signature.hh:137
DerivativeTraitsT< T > DerivativeTraits
Definition: signature.hh:123
Definition: polynomial.hh:7
Definition: signature.hh:106
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition: signature.hh:159