/usr/include/dune/functions/common/callable.hh is in libdune-functions-dev 2.5.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_FUNCTIONS_COMMON_CALLABLE_HH
#define DUNE_FUNCTIONS_COMMON_CALLABLE_HH
#include <memory>
#include <functional>
#include <dune/common/function.hh>
#include <dune/common/shared_ptr.hh>
namespace Dune {
namespace Functions {
/**
* \brief Wrap a Dune::VirtualFunction into a callable object
*
* \ingroup FunctionImplementations
*
* \tparam F Some function deriving from Dune::VirtualFunction
*
* This class provides an operator() that forwards to the evaluate
* method. In order to allow this F::RangeType must be default constructible.
* This class is copyable and ownership policy of the wrapped function
* (see constructors) will be the same for all copies.
*
* This models the \ref Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> concept.
*
* Using this wrapper you can e.g. pass a Dune::VirtualFunction<D,R> to
* the standard wrapper std::function<R(D)>.
*/
template<class F>
class CallableFunctionWrapper
{
typedef typename F::Range Range;
typedef typename F::Domain Domain;
public:
/**
* \brief Instanciate from reference to f
*
* The CallableFunctionWrapper will not take ownership
* of the provided function.
*/
CallableFunctionWrapper(const F& f)
{
f_ = Dune::stackobject_to_shared_ptr(f);
}
/**
* \brief Instanciate from shared_ptr to f
*
* The CallableFunctionWrapper will share ownership
* with the provided function.
*/
CallableFunctionWrapper(const std::shared_ptr<const F>& f) :
f_(f)
{}
/**
* \brief Forward operator() to F::evaluate()
*
* This uses the default constructor of F::RangeType
*/
Range operator()(const Domain& x) const
{
Range y;
f_->evaluate(x, y);
return y;
}
private:
std::shared_ptr<const F> f_;
};
/**
* \brief Create a callable object from some Dune::VirtualFunction
*
* \ingroup FunctionImplementations
*
* \tparam F Function type derived from Dune::VirtualFunction
* \param f The function to be wrapper
*
* The returned object will only be valid as long f is valid.
* You can e.g. do the following:
* \code
* // Create some F derived from VirtualFunction<D,R>
* F f;
*
* // store callable directly
* auto fc = callable(f);
*
* // store callable through default wrapper
* std::function<R(D)> stdF = callable(f)
* \endcode
*/
template<class F>
CallableFunctionWrapper<F> callable(const F& f)
{
return CallableFunctionWrapper<F>(f);
}
/**
* \brief Create a callable object from shared_ptr<F>
*
* \ingroup FunctionImplementations
*
* \tparam F Function type derived from Dune::VirtualFunction
* \param fp shared_ptr<F> to the function to be wrapper
*
* The returned object will share ownership of fp
* using a shared_ptr. You can e.g. do the following:
* \code
* // Create some F derived from VirtualFunction<D,R>
* auto f = make_shared<F>();
*
* // store callable directly
* auto f1 = callable(f);
*
* // store callable through default wrapper
* std::function<R(D)> f2 = callable(f)
*
* // Create some F derived from VirtualFunction<D,R> and only store
* // it in the callable wrapper
* auto f3 = callable(make_shared<F>());
* \endcode
*/
template<class F>
CallableFunctionWrapper<F> callable(const std::shared_ptr<F>& fp)
{
return CallableFunctionWrapper<F>(fp);
}
} // namespace Functions
} // namespace Dune
#endif //DUNE_FUNCTIONS_COMMON_CALLABLE_HH
|