49 template <
typename _Signature>
61 template <
typename _Res,
typename... _Args>
69 template <
template <
class>
class _DerivedFn,
class _Signature>
88 template <
typename _Res,
typename... _Args>
120 virtual eval(_Args... args) = 0;
129 virtual operator() (_Args... args) final
131 return this->eval(std::forward<_Args>(args)...);
139 template <
class _Class,
class _MemberPtr>
143 template <
class _Res,
class _Class,
class... _Args>
148 _Res(_Class::*m_pmf)(_Args...);
170 return ((*m_obj).*m_pmf)(std::forward<_Args> (args)...);
176 template <
typename _Res,
typename _Class,
typename... _Args>
181 _Res(_Class::*m_pmf)(_Args...);
203 return ((*m_obj).*m_pmf)(std::forward<_Args>(args)...);
208 template <
class _Class,
class _Res,
class... _Args>
217 template <
class _Class,
class _Res,
class... _Args>
225 template <
class _Class,
class _Res,
class... _Args>
234 template <
class _Class,
class _Res,
class... _Args>
244 template <
class _Signature>
248 template <
class _Res,
class... _Args>
277 template <
class _Res,
class... _Args>
278 inline ConstantFunction<_Res(_Args...)>
285 template <CepsSize _N,
class _Object,
class _Signature>
289 template <
CepsSize _N,
class _Object,
class _Res,
class... _Args>
316 KeyType key = std::get<_N> (std::forward_as_tuple<_Args...>(args...));
318 return std::invoke(&m_map.at(key), args...);
322 template<
char _Op,
typename _T1,
typename _T2>
326 template<
typename _T1,
typename _T2>
334 template<
typename _T1,
typename _T2>
342 template<
typename _T1,
typename _T2>
346 using type = decltype(CepsMathOperation<_T1, _T2>::mult(std::declval<_T1>(),std::declval<_T2>()));
350 template<typename _T1, typename _T2>
351 struct ResultOfOperationStruct<'/
', _T1, _T2>
354 using type = decltype(CepsMathOperation<_T1, _T2>::div(std::declval<_T1>(),std::declval<_T2>()));
358 template<char _Op, typename _T1, typename _T2>
359 using ResultOfOperation = typename ResultOfOperationStruct<_Op, _T1, _T2>::type;
363 template <char _Op, typename _Res1, typename _Res2, typename... _Args>
364 struct FunctionOperation:
365 public Function<ResultOfOperation<_Op, _Res1, _Res2>(_Args...)>
368 using Fn1 = Function<_Res1 (_Args...)>;
370 using Fn2 = Function<_Res2 (_Args...)>;
372 using Result = ResultOfOperation<_Op, _Res1, _Res2>;
374 const Fn1* m_fn1; ///< @brief left operand
375 const Fn2* m_fn2; ///< @brief right operand
378 FunctionOperation(const Fn1* fn1, const Fn2* fn2) :
384 FunctionOperation(const FunctionOperation& fp) = default;
388 operator=(const FunctionOperation& fp) = default;
391 eval(_Args... args) override
393 _Res1 res1 = this->m_fn1->operator()(std::forward<_Args> (args)...);
394 _Res2 res2 = this->m_fn2->operator()(std::forward<_Args> (args)...);
396 if constexpr (_Op == '+
')
397 return CepsMathOperation<_Res1, _Res2>::plus(res1, res2);
398 if constexpr (_Op == '-
')
399 return CepsMathOperation<_Res1, _Res2>::minus(res1, res2);
400 if constexpr (_Op == '*
')
401 return CepsMathOperation<_Res1, _Res2>::mult(res1, res2);
402 if constexpr (_Op == '/
')
403 return CepsMathOperation<_Res1, _Res2>::div(res1, res2);
409 template<typename _T1, typename _T2, typename... _Args>
410 ceps::FunctionOperation<'+
', _T1, _T2, _Args...>
411 operator+(const ceps::Function<_T1(_Args...)>& f1, const ceps::Function<_T2(_Args...)>& f2)
416 template<typename _T1, typename _T2, typename... _Args>
417 ceps::FunctionOperation<'-
', _T1, _T2, _Args...>
418 operator-(const ceps::Function<_T1(_Args...)>& f1, const ceps::Function<_T2(_Args...)>& f2)
423 template<typename _T1, typename _T2, typename... _Args>
424 ceps::FunctionOperation<'*
', _T1, _T2, _Args...>
425 operator*(const ceps::Function<_T1(_Args...)>& f1, const ceps::Function<_T2(_Args...)>& f2)
430 template<typename _T1, typename _T2, typename... _Args>
431 ceps::FunctionOperation<'/
', _T1, _T2, _Args...>
432 operator/(const ceps::Function<_T1(_Args...)>& f1, const ceps::Function<_T2(_Args...)>& f2)
#define CEPS_ABORT_IF(condition, message)
Stops the execution with a message if condition is true. If testing is enabled, only throws a runtime...
std::map< _Key, _Tp, _Compare, _Alloc > CepsMap
C++ map.
std::tuple< _Args... > CepsTuple
C++ tuple.
size_t CepsSize
Size unsigned.
A namespace for all utility methods.
auto newFunction(_Class obj, _Res(_Class::*fn)(_Args...)) noexcept
Transforms a member function of class into a MemberFunction struct.
auto asFunction(_Class obj, _Res(_Class::*fn)(_Args...)) noexcept
Transforms a member function of class into a MemberFunction struct.
_Type * getNew(_Args... args)
Allocates memory for one object. Be careful, the expansion of arguments may produce some weird result...
typename ResultOfImpl< _Fn >::type ResultOf
Used to get the return type of a function.
Ceps math operator functor, holds (+,-,*,/) definitions depending on mathematical definitions,...
_Res eval(_Args...) override
Call operator.
ConstantFunction(const _Res &var)
Constructor with value.
const _Res & m_var
Returned value.
~ConstantFunction() override
Destructor.
ConstantFunction(const ConstantFunction &that)
Copy constructor.
Specialization of ceps::Function that returns constant values.
_Res(_Args...) SignatureType
signature type
Function()=default
Construct a new Function object.
Function(Function &&) noexcept=default
Copy constructor.
_Res ReturnType
Return type definition.
Function(const Function &)=default
Copy constructor.
function caller : abstract base, only contains an variadic operator()
MemberFunction(const MemberFunction &that)
Copy constructor.
MemberFunction(_Class &obj, _Res(_Class::*pmf)(_Args...))
Constructor with member function.
~MemberFunction() override
Destructor.
_Res eval(_Args... args) final
Call operator.
_Class * m_obj
A pointer to the instance of the member.
~MemberFunction() override
Destructor.
_Class * m_obj
The instance of the method.
_Res eval(_Args... args) final
Call operator.
MemberFunction(const MemberFunction &that)
Copy constructor.
MemberFunction(_Class *obj, _Res(_Class::*pmf)(_Args...))
Constructor with member function ptr.
Just to say that MemberFunction will be templated.
PiecewiseFunction(const PiecewiseFunction &that)
Copy constructor.
CepsMap< KeyType, _Object > m_map
Values.
std::remove_cvref_t< std::tuple_element_t< _N, CepsTuple< _Args... > >> KeyType
extract the type that designate the region
PiecewiseFunction(const CepsMap< KeyType, _Object > &map)
Constructor with values.
~PiecewiseFunction() override
Destructor.
_Res eval(_Args... args) final
Call operator.
Specialization of ceps::Function with several constant values.
_Res type
the type to return
typename ResultOfImpl< Function< _Signature > >::type type
the type to return
Simply to indicate that ResultOfImpl will be a template to be specialized.
_Fn type
the type to return
decltype(CepsMathOperation< _T1, _T2 >::minus(std::declval< _T1 >(), std::declval< _T2 >())) type
Type of result of substraction.
decltype(CepsMathOperation< _T1, _T2 >::plus(std::declval< _T1 >(), std::declval< _T2 >())) type
Type of result of addition.