16 #ifndef OPENKALMAN_EIGEN_FUNCTOR_COMPOSITION_HPP 17 #define OPENKALMAN_EIGEN_FUNCTOR_COMPOSITION_HPP 19 #include <type_traits> 28 template<
typename F1,
typename F2>
36 template<
typename T,
typename =
void>
38 struct maybe_constexpr {
using type = T; };
42 template<constexpr_unary_operation_defined T>
43 struct maybe_constexpr<T>
46 struct maybe_constexpr<T, std::enable_if_t<constexpr_unary_operation_defined<T>>>
53 using CF1 =
typename maybe_constexpr<F1>::type;
54 using CF2 =
typename maybe_constexpr<F2>::type;
59 constexpr
functor_composition() requires std::default_initializable<CF1> and std::default_initializable<CF2> =
default;
61 template<
typename X = CF1, std::enable_if_t<std::is_default_constructible_v<X> and std::is_default_constructible_v<CF2>,
int> = 0>
67 template<
typename Arg>
68 static constexpr decltype(
auto)
69 get_constexpr_op(Arg&& arg)
72 else return std::forward<Arg>(arg);
77 template<
typename MF1,
typename MF2>
79 : m_functor1 {get_constexpr_op(std::forward<MF1>(f1))}, m_functor2{get_constexpr_op(std::forward<MF2>(f2))} {}
82 template<
typename Scalar>
83 constexpr
auto operator()(
const Scalar& a)
const {
return m_functor1(m_functor2(a)); }
86 template<
typename Packet>
87 constexpr
auto packetOp(
const Packet& a)
const {
return m_functor1.packetOp(m_functor2.packetOp(a)); }
90 constexpr decltype(
auto) functor1()
const & {
return m_functor1; }
91 constexpr decltype(
auto) functor1()
const && {
return std::forward<CF1>(m_functor1); }
93 constexpr decltype(
auto) functor2()
const & {
return m_functor2; }
94 constexpr decltype(
auto) functor2()
const && {
return std::forward<CF2>(m_functor2); }
107 template<
typename F1,
typename F2>
112 template<
typename F1,
typename F2>
122 static constexpr
bool preserves_triangle = UnaryFunctorTraits1::preserves_triangle and UnaryFunctorTraits2::preserves_triangle;
123 static constexpr
bool preserves_hermitian = UnaryFunctorTraits1::preserves_hermitian and UnaryFunctorTraits2::preserves_hermitian;
125 template<
typename UnaryOp,
typename XprType>
126 static constexpr
auto get_constant(
const Eigen::CwiseUnaryOp<UnaryOp, XprType>& arg)
134 template<
typename Arg>
135 static constexpr
auto get_constant_diagonal(
const Arg& arg)
147 template<
typename F1,
typename F2>
148 struct functor_traits<
OpenKalman::Eigen3::functor_composition<F1, F2>>
152 Cost =
int{functor_traits<std::decay_t<F1>>::Cost} +
int{functor_traits<std::decay_t<F2>>::Cost},
153 PacketAccess = functor_traits<std::decay_t<F1>>::PacketAccess and functor_traits<std::decay_t<F2>>::PacketAccess,
160 #endif //OPENKALMAN_EIGEN_FUNCTOR_COMPOSITION_HPP An operation involving some number of values.
Definition: operation.hpp:69
Definition: eigen-forward-declarations.hpp:41
The constant associated with T, assuming T is a constant_matrix.
Definition: constant_coefficient.hpp:36
The root namespace for OpenKalman.
Definition: basics.hpp:34
The constant associated with T, assuming T is a constant_diagonal_matrix.
Definition: constant_diagonal_coefficient.hpp:32
Definition: eigen-forward-declarations.hpp:22
constexpr bool fixed
T is a values::value that is determinable at compile time.
Definition: fixed.hpp:60
Compose two Eigen functors F1 and F2.
Definition: functor_composition.hpp:29
Definition: ConstantAdapter.hpp:21