dune-localfunctions  2.8.0
common/localinterpolation.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_LOCALFUNCTIONS_COMMON_LOCALINTERPOLATION_HH
4 #define DUNE_LOCALFUNCTIONS_COMMON_LOCALINTERPOLATION_HH
5 
6 #include <functional>
7 
8 #include <dune/common/concept.hh>
9 
10 
11 
12 namespace Dune {
13 
14  namespace Impl {
15 
16  // Concept for function supporting f.evaluate(Domain, Range&)
17  template<class Domain, class Range>
18  struct FunctionWithEvaluate
19  {
20  template<class F>
21  auto require(F&& f) -> decltype(
22  f.evaluate(std::declval<Domain>(), std::declval<Range&>())
23  );
24  };
25 
26  // Concept for function supporting f(Domain)
27  template<class Domain>
28  struct FunctionWithCallOperator
29  {
30  template<class F>
31  auto require(F&& f) -> decltype(
32  f(std::declval<Domain>())
33  );
34  };
35 
36  // Create function supporting Range = f(Domain)
37  // If the argument already does this, just forward it.
38  template<class Domain, class F,
39  std::enable_if_t<models<FunctionWithCallOperator<Domain>, F>(), int> = 0>
40  decltype(auto) makeFunctionWithCallOperator(const F& f)
41  {
42  return f;
43  }
44 
45  // Create function supporting Range = f(Domain)
46  // If the argument does not support this, wrap it in a lambda
47  template<class Domain, class F,
48  std::enable_if_t<not models<FunctionWithCallOperator<std::decay_t<Domain> >, F>(), int> = 0>
49 #ifndef DUNE_DEPRECATED_INTERPOLATE_CHECK
50  [[deprecated( "Passing functions only supporting 'f.evaluate(x,y)' to interpolate() is deprecated."
51  "Use functions supporting operator(), i.e. f(x) instead!")]]
52 #endif
53  decltype(auto) makeFunctionWithCallOperator(const F& f)
54  {
55  return [&](auto&& x) {
56  typename std::decay_t<F>::Traits::RangeType y;
57  f.evaluate(x,y);
58  return y;
59  };
60  }
61 
62  } // namespace Impl
63 
64 } // namespace Dune
65 #endif
Definition: bdfmcube.hh:16