EmrysFilter 0.1.0
State estimation utilities in C++23 using Eigen
Loading...
Searching...
No Matches
Forwarding.h
Go to the documentation of this file.
1#pragma once
2
10
11#include <concepts>
12#include <type_traits>
13#include <utility>
14
15#include <Eigen/Core>
16
17namespace Emrys
18{
19
20namespace internal
21{
22
26template <typename T>
27using CrtpDerived = std::remove_cvref_t<decltype(std::declval<std::remove_cvref_t<T> &>().derived())>;
28
29} // namespace internal
30
38template <typename T>
39concept MatrixExpression = requires { typename internal::CrtpDerived<T>; }
40 && std::derived_from<std::remove_cvref_t<T>, Eigen::MatrixBase<internal::CrtpDerived<T>>>;
41
47template <typename T>
48concept DiagonalExpression = std::derived_from<std::remove_cvref_t<T>, Eigen::DiagonalBase<std::remove_cvref_t<T>>>;
49
55template <typename T>
57
58namespace internal
59{
60
64template <typename Scalar, MatrixExpression M>
65[[nodiscard]] decltype(auto)
66castScalar(M && m)
67{
68 if constexpr (std::is_same_v<typename std::remove_cvref_t<M>::Scalar, Scalar>)
69 {
70 return std::forward<M>(m);
71 }
72 else
73 {
74 return m.template cast<Scalar>();
75 }
76}
77
79template <typename T, typename U>
80using ConstLike = std::conditional_t<
81 std::is_const_v<std::remove_reference_t<T>>,
82 std::remove_reference_t<U> const,
83 std::remove_reference_t<U>>;
84
86template <typename T, typename U>
87using ForwardedLike = std::conditional_t<std::is_lvalue_reference_v<T>, ConstLike<T, U> &, ConstLike<T, U> &&>;
88
92template <typename T, typename U>
93[[nodiscard]] constexpr ForwardedLike<T, U>
94forwardLike(U && u) noexcept
95{
96 return static_cast<ForwardedLike<T, U>>(u);
97}
98
99} // namespace internal
100
101} // namespace Emrys
A covariance as a function that stores one takes it: a MatrixExpression, or a DiagonalExpression,...
Definition Forwarding.h:56
A diagonal matrix or diagonal expression, possibly cv- or reference-qualified, such as v....
Definition Forwarding.h:48
A dense matrix or matrix expression, possibly cv- or reference-qualified: what a const Eigen::MatrixB...
Definition Forwarding.h:39