3 #ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
4 #define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
9 #include <dune/functions/common/defaultderivativetraits.hh>
26 struct yes { std::size_t dummy[2]; };
27 struct no { std::size_t dummy[1]; };
30 static yes test(
const decltype(&C::operator()) *);
34 enum { value = (
sizeof(test<F>(0)) ==
sizeof(yes)) };
37 template<
typename R,
typename D>
38 struct IsCallable<R(D)>
40 enum { value =
true };
43 template<
typename R,
typename D>
44 struct IsCallable<R(*)(D)>
46 enum { value =
true };
55 template<class Signature, bool isCallable = IsCallable<Signature>::value >
66 template <
typename C,
typename R,
typename D>
67 struct SignatureTraits<R(C::*)(D) const, true>
68 :
public SignatureTraits<R(D), true>
72 template <
typename C,
typename R,
typename D>
73 struct SignatureTraits<R(C::*)(D), true>
74 :
public SignatureTraits<R(D), true>
78 template <
typename R,
typename D>
79 struct SignatureTraits<R(*)(D),
true>
80 :
public SignatureTraits<R(D),
true>
84 template<
class R,
class D>
85 struct SignatureTraits<R(D), true>
90 using RawRange =
typename std::decay<Range>::type;
91 using RawDomain =
typename std::decay<Domain>::type;
93 using RawSignature = RawRange(RawDomain);
95 template<
template<
class>
class DerivativeTraits=DefaultDerivativeTraits>
96 using DerivativeSignature =
typename DerivativeTraits<RawSignature>::Range(Domain);
101 template<
class Signature,
template<
class>
class DerivativeTraits=DefaultDerivativeTraits>
113 template<
class Range,
class Domain,
template<
class>
class DerivativeTraitsT>
114 struct SignatureTag<Range(Domain), DerivativeTraitsT>
116 using Signature = Range(Domain);
119 using DerivativeTraits = DerivativeTraitsT<T>;
132 template<
class Range,
class Domain,
template<
class>
class DerivativeTraits>
135 using DerivativeRange =
typename DerivativeTraits<Range(Domain)>::Range;
136 return SignatureTag<DerivativeRange(Domain), DerivativeTraits>();
154 template<std::
size_t maxOrder,
class Signature,
template<
class>
class DerivativeTraits>
157 if constexpr (maxOrder==0) {
159 return std::make_tuple(tag);
166 return std::apply([&](
auto&&... tailTags){
167 return std::make_tuple(tag, tailTags...);
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition: signature.hh:133
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition: signature.hh:155
Dune namespace.
Definition: alignedallocator.hh:13
Helper class to check that F is callable.
Definition: signature.hh:20
Helper class to deduce the signature of a callable.
Definition: signature.hh:56